package go.kr.project.carInspectionPenalty.registrationOm.service.impl;

import egovframework.util.SessionUtil;
import go.kr.project.carInspectionPenalty.registrationOm.model.CarFfnlgTrgtIncmpVO;
import go.kr.project.carInspectionPenalty.registrationOm.service.ComparisonOmService;
import go.kr.project.carInspectionPenalty.registrationOm.service.impl.om_checker.*;
import go.kr.project.login.model.LoginUserVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;

/**
 * 과태료 대상 미필 비교 서비스 구현체
 *
 * <p>각 비교 로직을 독립적인 체커 클래스로 분리하여 관리합니다.</p>
 * <p>미필의 경우 부과일자 = 검사유효기간 종료일 + 146일</p>
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class ComparisonOmServiceImpl extends EgovAbstractServiceImpl implements ComparisonOmService {

    private final ProductUseOmChecker productUseOmChecker;
    private final TransferOmChecker transferOmChecker;
    private final OwnerTransferOmChecker ownerTransferOmChecker;

    /**
     * 비교 로직 메인 메서드
     *
     * <p>순차적으로 각 비교 체커를 실행하고, 하나라도 적용되면 즉시 종료합니다.</p>
     * <p>미필의 경우 부과일자(levyCrtrYmd)가 미리 계산되어 existingData에 포함됩니다.</p>
     */
    @Override
    public String executeComparison(CarFfnlgTrgtIncmpVO existingData, LoginUserVO userInfo) {
        String vhclno = existingData.getVhclno();
        String levyCrtrYmd = existingData.getLevyCrtrYmd();
        log.info("========== 미필 비교 로직 시작: {}, 부과일자: {} ==========", vhclno, levyCrtrYmd);

        // 사용자 조직코드 추출
        String userOrgCd = userInfo != null ? userInfo.getOrgCd() : null;

        // ========== 1. 상품용 체크 - api-1번호출.소유자명.contains("상품용") ==========
        String productUseResult = productUseOmChecker.check(existingData, userOrgCd);
        if (productUseResult != null) {
            log.info("========== 미필 비교 로직 종료 (상품용): {} ==========", vhclno);
            return productUseResult;
        }

        // ========== 2. 명의이전 소유자 확인 (검사유효기간 종료일 이후 명의이전) ==========
        String ownerTransferResult = ownerTransferOmChecker.check(existingData, userOrgCd);
        if (ownerTransferResult != null) {
            log.info("========== 미필 비교 로직 종료 (명의이전 소유자 확인): {} ==========", vhclno);
            return ownerTransferResult;
        }

        // ========== 3. 이첩 체크 ==========
        String transferResult = transferOmChecker.check(existingData, userOrgCd);
        if (transferResult != null) {
            log.info("========== 미필 비교 로직 종료 (이첩): {} ==========", vhclno);
            return transferResult;
        }

        log.info("========== 미필 비교 로직 종료 (미적용): {} ==========", vhclno);
        return null;
    }
}
