package go.kr.project.api.model.response;

import go.kr.project.api.config.ApiConstant;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 자동차 등록 원부(갑) 마스터 엔티티 VO, DB 저장용
 *
 * <p>tb_car_ledger_frmbk 테이블 매핑</p>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VmisCarLedgerFrmbkVO {

    // ==== Static factory/mapping methods (moved from Service) ====
    public static VmisCarLedgerFrmbkVO fromRequest(go.kr.project.api.model.request.LedgerRequest request) {
        return VmisCarLedgerFrmbkVO.builder()
                .infoSysId(request.getInfoSysId())
                .infoSysIp(request.getInfoSysIp())
                .sigunguCode(request.getSigunguCode())
                .cntcInfoCode(request.getCntcInfoCode())
                .chargerId(request.getChargerId())
                .chargerIp(request.getChargerIp())
                .chargerNm(request.getChargerNm())
                .dmndVhrno(request.getVhrno())
                .rgtr(ApiConstant.DEFAULT_REGISTRANT)
                .build();
    }

    public static VmisCarLedgerFrmbkVO fromResponseMaster(String id, go.kr.project.api.model.response.LedgerResponse res) {
        return VmisCarLedgerFrmbkVO.builder()
                .carLedgerFrmbkId(id)  // 등록원부 ID
                .cntcResultCode(res.getCntcResultCode())  // 연계 결과 코드
                .cntcResultDtls(res.getCntcResultDtls())  // 연계 결과 상세
                .ledgerGroupNo(res.getLedgerGroupNo())  // 원부 그룹 번호
                .ledgerIndvdlzNo(res.getLedgerIndvdlzNo())  // 원부 개별화 번호
                .vhmno(res.getVhmno())  // 차량관리번호
                .vhrno(res.getVhrno())  // 차량번호
                .vin(res.getVin())  // 차대번호
                .vhctyAsortCode(res.getVhctyAsortCode())  // 차종 종별 코드
                .vhctyAsortNm(res.getVhctyAsortNm())  // 차종 종별명
                .cnm(res.getCnm())  // 차명
                .colorCode(res.getColorCode())  // 색상 코드
                .colorNm(res.getColorNm())  // 색상명
                .nmplStndrdCode(res.getNmplStndrdCode())  // 번호판 규격 코드
                .nmplStndrdNm(res.getNmplStndrdNm())  // 번호판 규격명
                .prposSeCode(res.getPrposSeCode())  // 용도 구분 코드
                .prposSeNm(res.getPrposSeNm())  // 용도 구분명
                .mtrsFomNm(res.getMtrsFomNm())  // 원동기 형식명
                .fomNm(res.getFomNm())  // 형식명
                .acqsAmount(res.getAcqsAmount())  // 취득 금액
                .registDetailCode(res.getRegistDetailCode())  // 등록 상세 코드
                .registDetailNm(res.getRegistDetailNm())  // 등록 상세명
                .frstRegistDe(res.getFrstRegistDe())  // 최초 등록일
                .caagEndde(res.getCaagEndde())  // 차령 만료일자
                .prye(res.getPrye())  // 연식
                .spmnno1(res.getSpmnno1())  // 제원관리번호1
                .spmnno2(res.getSpmnno2())  // 제원관리번호2
                .yblMd(res.getYblMd())  // 제작 년월일
                .trvlDstnc(res.getTrvlDstnc())  // 주행거리
                .insptValidPdBgnde(res.getInsptValidPdBgnde())  // 검사 유효 기간 시작일
                .insptValidPdEndde(res.getInsptValidPdEndde())  // 검사 유효 기간 종료일
                .chckValidPdBgnde(res.getChckValidPdBgnde())  // 점검 유효 기간 시작일
                .chckValidPdEndde(res.getChckValidPdEndde())  // 점검 유효 기간 종료일
                .registReqstSeNm(res.getRegistReqstSeNm())  // 등록 청구 구분명
                .frstRegistRqrcno(res.getFrstRegistRqrcno())  // 최초 등록 접수번호
                .nmplCsdyRemnrDe(res.getNmplCsdyRemnrDe())  // 번호판 영치 최고일
                .nmplCsdyAt(res.getNmplCsdyAt())  // 번호판 영치 여부
                .bssUsePd(res.getBssUsePd())  // 사업용 기간
                .octhtErsrPrvntcNticeDe(res.getOcthtErsrPrvntcNticeDe())  // 직권말소 예고통지일
                .ersrRegistDe(res.getErsrRegistDe())  // 말소 등록일
                .ersrRegistSeCode(res.getErsrRegistSeCode())  // 말소 등록 구분 코드
                .ersrRegistSeNm(res.getErsrRegistSeNm())  // 말소 등록 구분명
                .mrtgcnt(res.getMrtgcnt())  // 저당건수
                .vhclecnt(res.getVhclecnt())  // 압류건수
                .stmdcnt(res.getStmdcnt())  // 구조변경건수
                .adres1(res.getAdres1())  // 주소1
                .adresNm1(res.getAdresNm1())  // 주소명1
                .adres(res.getAdres())  // 주소
                .adresNm(res.getAdresNm())  // 주소명
                .indvdlBsnmAt(res.getIndvdlBsnmAt())  // 개인사업자 여부
                .telno(res.getTelno())  // 전화번호
                .mberNm(res.getMberNm())  // 소유자명
                .mberSeCode(res.getMberSeCode())  // 소유자 구분 코드
                .mberSeNo(res.getMberSeNo())  // 소유자 번호
                .taxxmptTrgterSeCode(res.getTaxxmptTrgterSeCode())  // 면세 대상 구분 코드
                .taxxmptTrgterSeCodeNm(res.getTaxxmptTrgterSeCodeNm())  // 면세 대상 구분명
                .cntMatter(res.getCntMatter())  // 내용 사항
                .emdNm(res.getEmdNm())  // 읍면동명
                .prvntccnt(res.getPrvntccnt())  // 예방건수
                .xportFlflAtSttemntDe(res.getXportFlflAtSttemntDe())  // 수출이행신고일
                .partnRqrcno(res.getPartnRqrcno())  // 협력업체 접수번호
                .build();
    }

    // PK
    private String carLedgerFrmbkId;

    // 요청(헤더/본문) 정보
    private String infoSysId;
    private String infoSysIp;
    private String sigunguCode;
    private String cntcInfoCode;
    private String chargerId;
    private String chargerIp;
    private String chargerNm;

    // 요청 본문
    private String dmndVhrno;
    private String dmndOnesInformationOpen;
    private String dmndCpttrNm;
    private String dmndCpttrIhidnum;
    private String dmndCpttrLegaldongCode;
    private String dmndRouteSeCode;
    private String dmndDetailExpression;
    private String dmndInqireSeCode;

    // 응답 요약 정보
    private String cntcResultCode;
    private String cntcResultDtls;

    // 응답 본문(마스터)
    private String ledgerGroupNo;
    private String ledgerIndvdlzNo;
    private String vhmno;
    private String vhrno;
    private String vin;
    private String vhctyAsortCode;
    private String vhctyAsortNm;
    private String cnm;
    private String colorCode;
    private String colorNm;
    private String nmplStndrdCode;
    private String nmplStndrdNm;
    private String prposSeCode;
    private String prposSeNm;
    private String mtrsFomNm;
    private String fomNm;
    private String acqsAmount;
    private String registDetailCode;
    private String registDetailNm;
    private String frstRegistDe;
    private String caagEndde;
    private String prye;
    private String spmnno1;
    private String spmnno2;
    private String yblMd;
    private String trvlDstnc;
    private String insptValidPdBgnde;
    private String insptValidPdEndde;
    private String chckValidPdBgnde;
    private String chckValidPdEndde;
    private String registReqstSeNm;
    private String frstRegistRqrcno;
    private String nmplCsdyRemnrDe;
    private String nmplCsdyAt;
    private String bssUsePd;
    private String octhtErsrPrvntcNticeDe;
    private String ersrRegistDe;
    private String ersrRegistSeCode;
    private String ersrRegistSeNm;
    private String mrtgcnt;
    private String vhclecnt;
    private String stmdcnt;
    private String adres1;
    private String adresNm1;
    private String adres;
    private String adresNm;
    private String indvdlBsnmAt;
    private String telno;
    private String mberNm;
    private String mberSeCode;
    private String mberSeNo;
    private String taxxmptTrgterSeCode;
    private String taxxmptTrgterSeCodeNm;
    private String cntMatter;
    private String emdNm;
    private String prvntccnt;
    private String xportFlflAtSttemntDe;
    private String partnRqrcno;
    private String frstTrnsfrDe;
    private String processImprtyResnCode;
    private String processImprtyResnDtls;

    // 감사
    private String rgtr;
}
