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

import go.kr.project.api.model.request.NewBasicRequest;
import go.kr.project.api.model.request.NewLedgerRequest;
import go.kr.project.api.service.ExternalVehicleApiService;
import go.kr.project.api.service.VmisCarBassMatterInqireLogService;
import go.kr.project.api.service.VmisCarLedgerFrmbkLogService;
import go.kr.project.carInspectionPenalty.registrationOm.mapper.CarFfnlgTrgtIncmpMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.time.format.DateTimeFormatter;

/**
 * 미필 비교 로직 추상 클래스
 *
 * <p>공통 의존성 및 헬퍼 메서드를 제공합니다.</p>
 * <p>미필의 경우 부과일자 = 검사유효기간 종료일 + 146일</p>
 */
@Slf4j
@RequiredArgsConstructor
public abstract class AbstractComparisonOmChecker implements ComparisonOmChecker {

    protected final CarFfnlgTrgtIncmpMapper carFfnlgTrgtIncmpMapper;
    protected final ExternalVehicleApiService apiService;
    protected final VmisCarBassMatterInqireLogService bassMatterLogService;
    protected final VmisCarLedgerFrmbkLogService ledgerLogService;

    protected static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
    protected static final DateTimeFormatter DATE_FORMATTER_DASH = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 명의이전 또는 상품용 관련 일수 기준값 (일)
     * 명의이전일자 ~ 검사일 사이의 일수가 이 값 이하면 내사종결, 초과하면 날짜 수정 후 부과
     */
    protected static final int DAYS_THRESHOLD = 31;

    /**
     * 자동차기본정보 요청 객체 생성
     * 미필의 경우 levyCrtrYmd = 검사유효기간 종료일 + 146일
     *
     * @param vhrno 차량번호
     * @param vin 차대번호
     * @param levyCrtrYmd 부과일자 (미필: 검사유효기간 종료일 + 146일)
     * @return NewBasicRequest
     */
    protected NewBasicRequest createBasicRequest(String vhrno, String vin, String levyCrtrYmd) {
        NewBasicRequest request = new NewBasicRequest();

        NewBasicRequest.Record record = new NewBasicRequest.Record();
        record.setLevyCrtrYmd(levyCrtrYmd);

        if (vhrno != null) {
            record.setVhrno(vhrno);
            record.setInqSeCd("3");  // 3: 자동차번호
        } else if (vin != null) {
            record.setVin(vin);
            record.setInqSeCd("2");  // 2: 차대번호
        }

        request.setRecord(java.util.Arrays.asList(record));
        return request;
    }

    /**
     * 자동차등록원부(갑) 요청 객체 생성
     *
     * @param vhrno 차량번호
     * @param ownerNm 성명
     * @param idecno 주민번호
     * @param legalDongCd 법정동코드
     * @return NewLedgerRequest
     */
    protected NewLedgerRequest createLedgerRequest(String vhrno, String ownerNm, String idecno, String legalDongCd) {
        NewLedgerRequest request = new NewLedgerRequest();

        // 차량번호
        request.setVhrno(vhrno);

        // 민원인 정보
        request.setCvlprNm(ownerNm);
        request.setCvlprIdecno(idecno);
        request.setCvlprStdgCd(legalDongCd);

        // 개인정보공개 (1:소유자공개)
        request.setPrvcRls("1");

        // 경로구분코드 (고정값 3)
        request.setPathSeCd("3");

        // 내역표시 (1:전체내역)
        request.setDsctnIndct("1");

        // 조회구분코드 (1:열람)
        request.setInqSeCd("1");

        return request;
    }
}
