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

import egovframework.util.DateUtil;
import egovframework.util.StringUtil;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.model.response.NewLedgerResponse;

/**
 * 과태료 대상 비교 비고(Remark) 생성 유틸리티 클래스
 *
 * <p>각 비교 로직별 비고 문자열을 생성하는 메서드를 제공합니다.</p>
 */
public class ComparisonRemarkBuilder {

    /**
     * 상품용 비고 생성 - Case 1
     *
     * @param step1Record Step 1 API 응답 (검사일 기준 소유자명)
     * @param step4Record Step 4 API 응답 (명의이전 시점 소유자명)
     * @param ledgerRecord 조건에 맞는 갑부 레코드
     * @param vldPrdExpryYmd 유효기간만료일
     * @param inspEndYmd 검사종료일자
     * @return 비고 문자열
     */
    public static String buildProductUseRemark(
            NewBasicResponse.Record step1Record,
            NewBasicResponse.Record step4Record,
            NewLedgerResponse.Record ledgerRecord,
            String vldPrdExpryYmd,
            String inspEndYmd) {

        StringBuilder sb = new StringBuilder();
        sb.append("상품용 - 상품용검사\n");

        /*
        // 1. 검사일 기준 소유자 정보
        sb.append("\n■ 검사일 기준 소유자정보\n");
        sb.append("  - 소유자명: ").append(StringUtil.nvl(step1Record.getRprsOwnrNm())).append("\n");
        sb.append("  - 차대번호: ").append(StringUtil.nvl(step1Record.getVin())).append("\n");

        // 2. 명의이전 시점 소유자 정보
        sb.append("\n■ 명의이전 시점 소유자정보\n");
        sb.append("  - 소유자명: ").append(StringUtil.nvl(step4Record.getRprsOwnrNm())).append("\n");
        sb.append("  - 조회일자: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append("\n");

        // 3. 갑부 상세 정보 (명의이전 이력)
        sb.append("\n■ 갑부 상세 (명의이전 이력)\n");
        sb.append("  - 변경일자: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append("\n");
        sb.append("  - 변경업무코드: ").append(StringUtil.nvl(ledgerRecord.getChgTaskSeCd())).append("\n");
        //sb.append("  - 변경업무명: ").append(StringUtil.nvl(ledgerRecord.getChgTaskSeNm())).append("\n");
        //sb.append("  - 접수번호: ").append(StringUtil.nvl(ledgerRecord.getAplyRcptNo())).append("\n");


        // 4. 비교 기간
        sb.append("\n■ 비교 기간\n");
        sb.append("  - 유효기간만료일: ").append(DateUtil.formatDateString(vldPrdExpryYmd)).append("\n");
        sb.append("  - 검사종료일자: ").append(DateUtil.formatDateString(inspEndYmd)).append("\n");
        sb.append("  - 판정: 명의이전일자가 기간 내 존재하고 검사일 소유자명과 일치");
        */

        return sb.toString();
    }

    /**
     * 상품용 비고 생성 - Case 2 (검사일 소유자가 상품용이 아니지만, 명의이전 후 상품용인 경우)
     *
     * 비고 형식:
     * 명의이전(25.9.3.) 이전소유자 상품용
     * 22루2283
     * 검사기간 시작일자 - 종료일자
     * 검사일 일자
     * 명의이전 일자
     * 상품용 일자
     *
     * @param step1Record Step 1 API 응답 (검사일 기준 소유자명)
     * @param step4Record Step 4 API 응답 (명의이전 시점 소유자명 = 상품용)
     * @param ledgerRecord 조건에 맞는 갑부 레코드 (명의이전 레코드)
     * @param vhclno 차량번호
     * @param inspYmd 검사일자
     * @param vldPrdExpryYmd 유효기간만료일
     * @param inspEndYmd 검사종료일자
     * @param daysBetween 일수차이
     * @return 비고 문자열
     */
    public static String buildProductCloseLevyRemark(
            NewBasicResponse.Record step1Record,
            NewBasicResponse.Record step4Record,
            NewLedgerResponse.Record ledgerRecord,
            String vhclno,
            String inspYmd,
            String vldPrdExpryYmd,
            String inspEndYmd,
            long daysBetween) {

        // 날짜 포맷 변환 (YYYYMMDD -> YY.M.D)
        String chgYmdFormatted = DateUtil.formatToShortDate(ledgerRecord.getChgYmd());
        String step1wnerName = StringUtil.nvl(step1Record.getRprsOwnrNm());

        StringBuilder sb = new StringBuilder();

        // 첫 줄: 명의이전(25.9.3.) 이전소유자 상품용
        sb.append("명의이전(").append(chgYmdFormatted).append(") 이전소유자 상품용").append(", ");

        // 둘째 줄: 차량번호
        sb.append(StringUtil.nvl(vhclno)).append(", ");

        // 셋째 줄: 검사기간 시작일자 - 종료일자
        sb.append(" - 검사기간: ").append(DateUtil.formatDateString(vldPrdExpryYmd))
                .append(" - ").append(DateUtil.formatDateString(inspEndYmd)).append(", ");

        // 넷째 줄: 검사일 일자
        sb.append(" - 검사일: ").append(DateUtil.formatDateString(inspYmd)).append(", ");

        // 다섯째 줄: 명의이전 일자
        sb.append(" - 명의이전: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append(", ");

        // 여섯째 줄: 상품용 일자 (명의이전 일자와 동일)
        sb.append(" - 상품용: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append(", ");

        // 일곱째 줄: 일수차이
        sb.append("일수차이: ").append(daysBetween).append("일");

        return sb.toString();
    }


    /**
     * 명의이전 비고 생성 (내사종결 또는 날짜 수정 후 부과)
     *
     * 비고 형식:
     * 명의이전(25.9.3.) 이전소유자 상품용
     * 22루2283
     * 검사기간 시작일자 - 종료일자
     * 검사일 일자
     * 명의이전 일자
     * 상품용 일자
     *
     * @param step1Record Step 1 API 응답 (검사일 기준 소유자명)
     * @param step4Record Step 4 API 응답 (명의이전 시점 소유자명 = 상품용)
     * @param ledgerRecord 조건에 맞는 갑부 레코드 (명의이전 레코드)
     * @param vhclno 차량번호
     * @param inspYmd 검사일자
     * @param vldPrdExpryYmd 유효기간만료일
     * @param inspEndYmd 검사종료일자
     * @param daysBetween 일수차이
     * @return 비고 문자열
     */
    public static String buildOwnerChangeRemark(NewBasicResponse.Record step1Record,
                NewBasicResponse.Record step4Record,
                NewLedgerResponse.Record ledgerRecord,
                String vhclno,
                String inspYmd,
                String vldPrdExpryYmd,
                String inspEndYmd,
                long daysBetween) {

        // 날짜 포맷 변환 (YYYYMMDD -> YY.M.D)
        String chgYmdFormatted = DateUtil.formatToShortDate(ledgerRecord.getChgYmd());
        String step1wnerName = StringUtil.nvl(step1Record.getRprsOwnrNm());

        StringBuilder sb = new StringBuilder();

        // 첫 줄: 명의이전(25.9.3.) 이전소유자 상품용
        sb.append("명의이전(").append(chgYmdFormatted).append(")").append(", ");

        // 둘째 줄: 차량번호
        sb.append(StringUtil.nvl(vhclno)).append(", ");

        // 셋째 줄: 검사기간 시작일자 - 종료일자
        sb.append(" - 검사기간: ").append(DateUtil.formatDateString(vldPrdExpryYmd))
                .append(" - ").append(DateUtil.formatDateString(inspEndYmd)).append(", ");

        // 넷째 줄: 검사일 일자
        sb.append(" - 검사일: ").append(DateUtil.formatDateString(inspYmd)).append(", ");

        // 다섯째 줄: 명의이전 일자
        sb.append(" - 명의이전: ").append(DateUtil.formatDateString(ledgerRecord.getChgYmd())).append(", ");

        // 일곱째 줄: 일수차이
        sb.append("일수차이: ").append(daysBetween).append("일");

        return sb.toString();
    }

    /**
     * 등록원부 갑부 레코드 상세 정보 생성
     *
     * @param record 갑부 레코드
     * @return 상세 정보 문자열
     */
    public static String buildLedgerRecordDetail(NewLedgerResponse.Record record) {
        if (record == null) {
            return "";
        }

        StringBuilder detail = new StringBuilder();

        // 변경 정보
        StringUtil.appendIfNotEmpty(detail, "변경업무구분코드", record.getChgTaskSeCd());
        StringUtil.appendIfNotEmpty(detail, "변경업무구분명", record.getChgTaskSeNm());
        StringUtil.appendIfNotEmpty(detail, "변경일자", DateUtil.formatDateString(record.getChgYmd()));

        // 주요 정보
        StringUtil.appendIfNotEmpty(detail, "주요번호", record.getMainNo());
        StringUtil.appendIfNotEmpty(detail, "일련번호", record.getSno());
        StringUtil.appendIfNotEmpty(detail, "특별사항", record.getSpcablMttr());

        // 명의자 정보
        StringUtil.appendIfNotEmpty(detail, "명의자명", record.getHshldrNm());
        StringUtil.appendIfNotEmpty(detail, "명의자식별번호", StringUtil.maskIdecno(record.getHshldrIdecno()));

        // 기타
        StringUtil.appendIfNotEmpty(detail, "신청접수번호", record.getAplyRcptNo());
        StringUtil.appendIfNotEmpty(detail, "차량관리번호", record.getVhmno());
        StringUtil.appendIfNotEmpty(detail, "원부그룹번호", record.getLedgerGroupNo());
        StringUtil.appendIfNotEmpty(detail, "원부개별번호", record.getLedgerIndivNo());
        StringUtil.appendIfNotEmpty(detail, "상세일련번호", record.getDtlSn());

        return detail.toString();
    }
}
