package go.kr.project.api.config;

import go.kr.project.api.config.properties.VmisProperties;
import go.kr.project.api.service.VehicleInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * VMIS 통합 설정 및 모니터링
 *
 * <p>이 설정 클래스는 VMIS 통합 모드에 대한 정보를 제공하고,
 * 애플리케이션 시작 시 현재 활성화된 모드를 로그로 출력합니다.</p>
 *
 * <h3>주요 기능:</h3>
 * <ul>
 *   <li>애플리케이션 시작 시 VMIS 통합 모드 출력</li>
 *   <li>활성화된 VehicleInfoService 구현체 표시</li>
 *   <li>설정 검증 및 경고 메시지 출력</li>
 * </ul>
 *
 * <h3>지원하는 모드:</h3>
 * <ul>
 *   <li>internal: 내부 VMIS 모듈 직접 호출 (InternalVehicleInfoServiceImpl)</li>
 *   <li>external: 외부 REST API 호출 (ExternalVehicleInfoServiceImpl)</li>
 * </ul>
 */
@Slf4j
@Configuration
@RequiredArgsConstructor
public class VmisIntegrationConfig {

    private final VmisProperties vmisProperties;

    /**
     * VMIS 통합 모드 정보 출력
     *
     * <p>애플리케이션 시작 시 현재 설정된 VMIS 통합 모드와
     * 관련 설정 정보를 로그로 출력합니다.</p>
     *
     * @param vehicleInfoService 활성화된 VehicleInfoService 구현체
     * @return CommandLineRunner
     */
    @Bean
    public CommandLineRunner vmisIntegrationModeLogger(VehicleInfoService vehicleInfoService) {
        return args -> {
            String mode = vmisProperties.getIntegration().getMode();
            String implClass = vehicleInfoService.getClass().getSimpleName();

            log.info("========================================");
            log.info("VMIS Integration Mode: {}", mode);
            log.info("Active Implementation: {}", implClass);
            log.info("========================================");

            if ("internal".equalsIgnoreCase(mode)) {
                logInternalModeInfo();
            } else if ("external".equalsIgnoreCase(mode)) {
                logExternalModeInfo();
            } else {
                log.warn("알 수 없는 VMIS 통합 모드: {}. 'internal' 또는 'external'을 사용하세요.", mode);
            }
        };
    }

    /**
     * Internal 모드 설정 정보 출력
     */
    private void logInternalModeInfo() {
        log.info("[Internal Mode] 내부 VMIS 모듈을 직접 사용합니다");
        log.info("  - 정부 API 호스트: {}://{}",
                vmisProperties.getGov().getScheme(),
                vmisProperties.getGov().getHost());
        log.info("  - 기본사항 조회 경로: {}",
                vmisProperties.getGov().getServices().getBasic().getPath());
        log.info("  - 등록원부 조회 경로: {}",
                vmisProperties.getGov().getServices().getLedger().getPath());
        log.info("  - GPKI 암호화: {}",
                vmisProperties.getGpki().getEnabled());
        log.info("  - 연결 타임아웃: {}ms",
                vmisProperties.getRestTemplate().getInternal().getTimeout().getConnectTimeoutMillis());
        log.info("  - 읽기 타임아웃: {}ms",
                vmisProperties.getRestTemplate().getInternal().getTimeout().getReadTimeoutMillis());
        log.info("  - Rate Limit: 초당 {} 건",
                vmisProperties.getRestTemplate().getInternal().getRateLimit().getPermitsPerSecond());

        if ("Y".equalsIgnoreCase(vmisProperties.getGpki().getEnabled())) {
            log.info("  - GPKI 인증서 서버 ID: {}",
                    vmisProperties.getGpki().getCertServerId());
            log.info("  - GPKI 대상 서버 ID: {}",
                    vmisProperties.getGpki().getTargetServerId());
        } else {
            log.warn("  - GPKI 암호화가 비활성화되어 있습니다. 개발 환경에서만 사용하세요.");
        }
    }

    /**
     * External 모드 설정 정보 출력
     */
    private void logExternalModeInfo() {
        log.info("[External Mode] 외부 REST API를 사용합니다");
        log.info("  - 외부 API Base URL: {}",
                vmisProperties.getExternal().getApi().getUrl().getBase());
        log.info("  - 연결 타임아웃: {}ms",
                vmisProperties.getRestTemplate().getExternal().getTimeout().getConnectTimeoutMillis());
        log.info("  - 읽기 타임아웃: {}ms",
                vmisProperties.getRestTemplate().getExternal().getTimeout().getReadTimeoutMillis());
        log.info("  - Rate Limit: 초당 {} 건",
                vmisProperties.getRestTemplate().getExternal().getRateLimit().getPermitsPerSecond());
        log.warn("  - 외부 VMIS-interface 서버가 실행 중이어야 합니다.");
        log.info("  - 기본사항 조회: POST {}",
                vmisProperties.getExternal().getApi().getUrl().buildBasicUrl());
        log.info("  - 등록원부 조회: POST {}",
                vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl());
    }
}
