package com.takensoft.common.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.egovframe.rte.fdl.cmmn.trace.LeaveaTrace;
import org.egovframe.rte.fdl.cmmn.trace.handler.DefaultTraceHandler;
import org.egovframe.rte.fdl.cmmn.trace.handler.TraceHandler;
import org.egovframe.rte.fdl.cmmn.trace.manager.DefaultTraceHandleManager;
import org.egovframe.rte.fdl.cmmn.trace.manager.TraceHandlerService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
/**
 * @author takensoft
 * @since 2025.01.22
 * @modification
 *     since    |    author    | description
 *  2025.01.22  |  takensoft   | 최초 등록
 *
 * 기본 설정을 위한 Config
 */
@Configuration
public class AppConfig {

    /**
     * @return MappingJackson2JsonView - JSON 응답을 위한 뷰 객체
     *
     * JSON 응답을 반환할 때 사용하는 Jackson ObjectMapper를 설정하여, 모델에서 값을 추출하는 방식으로 JSON 응답을 생성
     */
    @Bean(name="jsonView")
    public MappingJackson2JsonView getJsonView () {
        ObjectMapper objectMapper = getObjectMapper();
        MappingJackson2JsonView jsonView = new MappingJackson2JsonView(objectMapper);
        jsonView.setExtractValueFromSingleKeyModel(true);
        return jsonView;
    }
    /**
     * @return ObjectMapper - JSON 직렬화 및 역직렬화를 위한 객체
     *
     * Java Time API를 위한 모듈을 등록하고, 날짜 포맷을 설정하는 등 ObjectMapper를 커스터마이즈하여 JSON 변환
     *
     */
    @Bean(name = "objectMapper")
    public ObjectMapper getObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();

        mapper.registerModule(new JavaTimeModule());
        //기본 날짜 포맷 비활성화
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        //새로운 날짜 포맷 세팅
		/*SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		mapper.setDateFormat(dateFormat);
		mapper.setTimeZone(TimeZone.getTimeZone("Asia/Seoul"));*/

        return mapper;
    }
    /**
     * @return AntPathMatcher - 경로 패턴 매칭을 위한 객체
     *
     * 경로 패턴을 매칭하여 URL 경로를 처리하는 데 사용되는 객체를 반환
     */
    @Bean
    public AntPathMatcher antPathMatcher() {
        return new AntPathMatcher();
    }
    /**
     * @return DefaultTraceHandler - 추적 처리를 위한 기본 핸들러
     *
     * 추적 요청을 처리하는 기본 핸들러를 반환
     */
    @Bean
    public DefaultTraceHandler defaultTraceHandler() {
        return new DefaultTraceHandler();
    }
    /**
     * @return DefaultTraceHandleManager - 추적 핸들러 관리 서비스 객체
     *
     * 여러 추적 핸들러와 경로 매칭 설정을 관리하는 서비스를 제공
     */
    @Bean
    public DefaultTraceHandleManager traceHandlerService() {
        DefaultTraceHandleManager defaultTraceHandleManager = new DefaultTraceHandleManager();
        defaultTraceHandleManager.setReqExpMatcher(antPathMatcher());
        defaultTraceHandleManager.setPatterns(new String[]{"*"});
        defaultTraceHandleManager.setHandlers(new TraceHandler[]{defaultTraceHandler()});
        return defaultTraceHandleManager;
    }
    /**
     * @return LeaveaTrace - 추적 기능을 위한 LeaveaTrace 객체
     *
     * 추적 핸들러 서비스를 설정하여 추적 기능을 활성화
     */
    @Bean
    public LeaveaTrace leaveaTrace() {
        LeaveaTrace leaveaTrace = new LeaveaTrace();
        leaveaTrace.setTraceHandlerServices(new TraceHandlerService[]{traceHandlerService()});
        return leaveaTrace;
    }



}
