package go.kr.project.api.external.service.impl;

import go.kr.project.api.external.service.ExternalVehicleApiService;
import go.kr.project.api.model.VehicleApiResponseVO;
import go.kr.project.api.model.request.BasicRequest;
import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.LedgerResponse;
import go.kr.project.api.service.VehicleInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;

/**
 * 외부 REST API를 호출하는 차량 정보 조회 서비스 구현체
 *
 * <p>이 구현체는 외부 VMIS-interface 서버의 REST API를 호출하여
 * 차량 정보를 조회합니다. 기존 ExternalVehicleApiService를 그대로 활용합니다.</p>
 *
 * <h3>활성화 조건:</h3>
 * <pre>
 * # application.yml
 * vmis:
 *   integration:
 *     mode: external
 * </pre>
 *
 * <h3>처리 흐름:</h3>
 * <ol>
 *   <li>기존 ExternalVehicleApiService에 요청 위임</li>
 *   <li>ExternalVehicleApiService가 외부 REST API 호출</li>
 *   <li>결과를 그대로 반환</li>
 * </ol>
 *
 * <h3>외부 API 서버:</h3>
 * <ul>
 *   <li>서버 URL: vmis.external.api.url 설정값 사용</li>
 *   <li>기본값: http://localhost:8081/api/v1/vehicles</li>
 *   <li>별도의 VMIS-interface 프로젝트가 실행 중이어야 함</li>
 * </ul>
 *
 * @see VehicleInfoService
 * @see ExternalVehicleApiService
 */
@Slf4j
@Service
@RequiredArgsConstructor
@ConditionalOnProperty(name = "vmis.integration.mode", havingValue = "external", matchIfMissing = true)
public class ExternalVehicleInfoServiceImpl extends EgovAbstractServiceImpl implements VehicleInfoService {

    private final ExternalVehicleApiService externalVehicleApiService;

    @Override
    public VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest) {
        String vehicleNumber = basicRequest.getVhrno();
        log.info("[External Mode] 차량 정보 조회 시작 - 차량번호: {}, 부과기준일: {}, 조회구분: {}",
                vehicleNumber, basicRequest.getLevyStdde(), basicRequest.getInqireSeCode());

        VehicleApiResponseVO response = externalVehicleApiService.getVehicleInfo(basicRequest);

        if (response.isSuccess()) {
            log.info("[External Mode] 차량번호 {} 조회 성공", vehicleNumber);
        } else {
            log.warn("[External Mode] 차량번호 {} 조회 실패 - {}", vehicleNumber, response.getMessage());
        }

        return response;
    }

    /**
     * 외부 REST - 기본정보 단독 조회
     * 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임 (BasicRequest 전체 전달)
     */
    @Override
    public BasicResponse getBasicInfo(BasicRequest request) {
        // 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임
        return externalVehicleApiService.getBasicInfo(request);
    }

    /**
     * 외부 REST - 등록원부 단독 조회
     * 중요 로직: 등록원부 조회는 LedgerRequest 전체를 받아서 외부 API에 전달
     */
    @Override
    public LedgerResponse getLedgerInfo(LedgerRequest request) {
        // 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임
        return externalVehicleApiService.getLedgerInfo(request);
    }
}
