package go.kr.project.api.model;

import go.kr.project.api.model.request.NewBasicRequest;
import go.kr.project.api.model.request.OldBasicRequest;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.model.response.OldBasicResponse;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 자동차 기본 사항 조회 엔티티, DB 저장용
 *
 * <p>API 호출 정보를 저장하는 테이블 매핑 클래스입니다.
 * 최초 요청 시 INSERT, 결과 수신 시 UPDATE 형태로 사용됩니다.</p>
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarBassMatterInqireVO {
    /**
     * 자동차 기본 사항 조회 ID (PK)
     * 형식: CBMI000000000001
     */
    private String carBassMatterInqireId;

    // 신규 응답용 txId
    private String txId;

    // ===== 요청 정보 =====
    /**
     * 정보 시스템 ID
     */
    private String infoSysId;

    /**
     * 정보 시스템 IP
     */
    private String infoSysIpAddr;

    /**
     * 시군구 코드
     */
    private String sggCd;

    /**
     * 연계 정보 코드
     */
    private String linkInfoCd;

    /**
     * 담당자 ID
     */
    private String picId;

    /**
     * 담당자 IP
     */
    private String picIpAddr;

    /**
     * 담당자명
     */
    private String picNm;

    /**
     * 요청 부과 기준일
     */
    private String dmndLevyCrtrYmd;

    /**
     * 요청 조회 구분 코드
     */
    private String dmndInqSeCd;

    /**
     * 요청 자동차등록번호
     */
    private String dmndVhrno;

    /**
     * 요청 차대번호
     */
    private String dmndVin;

    // ===== 응답 정보 (결과 수신 시 UPDATE) =====
    /**
     * 연계 결과 코드 - LINK_RSLT_CD
     */
    private String linkRsltCd;

    /**
     * 연계 결과 상세 - LINK_RSLT_DTL
     */
    private String linkRsltDtl;

    /**
     * 연식 - YRIDNW
     */
    private String yridnw;

    /**
     * 등록일 - REG_YMD
     */
    private String regYmd;

    /**
     * 말소 등록 구분 코드 - ERSR_REG_SE_CD
     */
    private String ersrRegSeCd;

    /**
     * 말소 등록 구분명 - ERSR_REG_SE_NM
     */
    private String ersrRegSeNm;

    /**
     * 말소 등록일 - ERSR_REG_YMD
     */
    private String ersrRegYmd;

    /**
     * 등록 상세 코드 - REG_DTL_CD
     */
    private String regDtlCd;

    /**
     * 배기량 - DSPLVL
     */
    private String dsplvl;

    /**
     * 사용 본거지 법정동 코드 - USGSRHLD_STDG_CD
     */
    private String usgsrhldStdgCd;

    /**
     * 사용 본거지 행정동 코드 - USGSRHLD_DONG_CD
     */
    private String usgsrhldDongCd;

    /**
     * 사용 본거지 산 - USGSRHLD_MTN_YN
     */
    private String usgsrhldMtnYn;

    /**
     * 사용 본거지 번지 - USGSRHLD_LNBR
     */
    private String usgsrhldLnbr;

    /**
     * 사용 본거지 호 - USGSRHLD_HO
     */
    private String usgsrhldHo;

    /**
     * 사용 본거지 상세주소 - USGSRHLD_ADDR_NM
     */
    private String usgsrhldAddrNm;

    /**
     * 사용 본거지 도로명 코드 - USGSRHLD_ROAD_NM_CD
     */
    private String usgsrhldRoadNmCd;

    /**
     * 사용 본거지 지하 건물 구분 코드 - USGSRHLD_UDGD_BLDG_SE_CD
     */
    private String usgsrhldUdgdBldgSeCd;

    /**
     * 사용 본거지 건물 주요 번호 - USGSRHLD_BMNO
     */
    private String usgsrhldBmno;

    /**
     * 사용 본거지 건물 부 번호 - USGSRHLD_BSNO
     */
    private String usgsrhldBsno;

    /**
     * 사용 본거지 전체주소 - USGSRHLD_WHOL_ADDR
     */
    private String usgsrhldWholAddr;

    /**
     * 대표소유자 회원 구분 코드 - RPRS_OWNR_MBR_SE_CD
     */
    private String rprsOwnrMbrSeCd;

    /**
     * 대표소유자 회원 번호 - RPRSV_OWNR_IDECNO
     */
    private String rprsvOwnrIdecno;

    /**
     * 대표소유자 전화번호 - RPRS_OWNR_TELNO
     */
    private String rprsOwnrTelno;

    /**
     * 소유자 법정동 코드 - OWNR_STDG_CD
     */
    private String ownrStdgCd;

    /**
     * 소유자 행정동 코드 - OWNR_DONG_CD
     */
    private String ownrDongCd;

    /**
     * 소유자 산 - OWNR_MTN_YN
     */
    private String ownrMtnYn;

    /**
     * 소유자 번지 - OWNR_LNBR
     */
    private String ownrLnbr;

    /**
     * 소유자 호 - OWNR_HO
     */
    private String ownrHo;

    /**
     * 소유자 상세주소 - OWNR_ADDR_NM
     */
    private String ownrAddrNm;

    /**
     * 소유자 도로명 코드 - OWNR_ROAD_NM_CD
     */
    private String ownrRoadNmCd;

    /**
     * 소유자 지하건물 구분 코드 - OWNR_UDGD_BLDG_SE_CD
     */
    private String ownrUdgdBldgSeCd;

    /**
     * 소유자 건물 주요 번호 - OWNR_BMNO
     */
    private String ownrBmno;

    /**
     * 소유자 건물 부 번호 - OWNR_BSNO
     */
    private String ownrBsno;

    /**
     * 소유자 전체주소 - OWNR_WHOL_ADDR
     */
    private String ownrWholaddr;

    /**
     * 신 차량번호 - REAR_VHRNO
     */
    private String rearVhrno;

    /**
     * 사용 연료 코드 - USE_FUEL_CD
     */
    private String useFuelCd;

    /**
     * 용도 구분 코드 - USG_SE_CD
     */
    private String usgSeCd;

    /**
     * 원동기 형식명 - MTRS_FOM_NM
     */
    private String mtrsFomNm;

    /**
     * 이전 차량번호 - BFR_VHRNO
     */
    private String bfrVhrno;

    /**
     * 차량번호 - VHRNO
     */
    private String vhrno;

    /**
     * 차대번호 - VIN
     */
    private String vin;

    /**
     * 차명 - ATMB_NM
     */
    private String atmbNm;

    /**
     * 차량 총 중량 - VHCL_TOTL_WT
     */
    private String vhclTotlWt;

    /**
     * 차령 만료일자 - VEAG_END_YMD
     */
    private String veagEndYmd;

    /**
     * 차번호 변경시기 - CHG_YMD
     */
    private String chgYmd;

    /**
     * 차종 종별 코드 - CARMDL_ASORT_CD
     */
    private String carmdlAsortCd;

    /**
     * 차종 유형 코드 - CARMDL_TYPE_CD
     */
    private String carmdlTypeCd;

    /**
     * 차종 분류 코드 - CARMDL_SE_CD
     */
    private String carmdlSeCd;

    /**
     * 최대 적재량 - MXMM_LDG
     */
    private String mxmmLdg;

    /**
     * 차종 종별명 - CARMDL_ASORT_NM
     */
    private String carmdlAsortNm;

    /**
     * 차종 유형명 - CARMDL_TYPE_NM
     */
    private String carmdlTypeNm;

    /**
     * 차종 분류명 - CARMDL_CLSF_NM
     */
    private String carmdlClsfNm;

    /**
     * 최초 등록일 - FRST_REG_YMD
     */
    private String frstRegYmd;

    /**
     * 형식 - FOM_NM
     */
    private String fomNm;

    /**
     * 취득 일자 - ACQS_YMD
     */
    private String acqsYmd;

    /**
     * 취득 종료일자 - ACQS_END_YMD
     */
    private String acqsEndYmd;

    /**
     * 제작 년월일 - FBCTN_YMD
     */
    private String fbctnYmd;

    /**
     * 이전 등록일 - TRANSR_REG_YMD
     */
    private String transrRegYmd;

    /**
     * 제원 등록 상태 코드 - SPCF_REG_STTS_CD
     */
    private String spcfRegSttsCd;

    /**
     * 색상명 - COLOR_NM
     */
    private String colorNm;

    /**
     * 저당수 - MRTG_CNT
     */
    private String mrtgCnt;

    /**
     * 압류건수 - SZR_CNT
     */
    private String szrCnt;

    /**
     * 구조변경수 - STRCT_CHG_CNT
     */
    private String strctChgCnt;

    /**
     * 번호판 영치 여부 - NOPLT_CSDY_YN
     */
    private String nopltCsdyYn;

    /**
     * 번호판 영치 최고일 - NOPLT_CSDY_AVTSMT_YMD
     */
    private String nopltCsdyAvtsmtYmd;

    /**
     * 출처 구분 코드 - SRC_SE_CD
     */
    private String srcSeCd;

    /**
     * 번호판 규격 코드 - NOPLT_SPCFCT_CD
     */
    private String nopltSpcfctCd;

    /**
     * 취득 금액 - ACQS_AMT
     */
    private String acqsAmt;

    /**
     * 검사 유효 기간 시작일 - INSP_VLD_PD_BGNG_YMD
     */
    private String inspVldPdBgngYmd;

    /**
     * 검사 유효 기간 종료일 - INSP_VLD_PD_END_YMD
     */
    private String inspVldPdEndYmd;

    /**
     * 사용 본거지 관청 코드 - USGSRHLD_GRC_CD
     */
    private String usgsrhldGrcCd;

    /**
     * 승차정원수 - RDCPCT_CNT
     */
    private String rdcpctCnt;

    /**
     * 제원관리번호 - SPMNNO
     */
    private String spmnno;

    /**
     * 주행거리 - DRVNG_DSTNC
     */
    private String drvngDstnc;

    /**
     * 최초 등록 접수번호 - FRST_REG_APLY_RCPT_NO
     */
    private String frstRegAplyRcptNo;

    /**
     * 예고통지일 - VLNT_ERSR_PRVNTC_AVTSMT_YMD
     */
    private String vlntErsrPrvntcAvtsmtYmd;

    /**
     * 등록 기관명 - OGNZ_NM
     */
    private String ognzNm;

    /**
     * 처리 불가 사유 코드 - PRCS_IMPRTY_RSN_CD
     */
    private String prcsImprtyRsnCd;

    /**
     * 처리 불가 사유 명세 - PRCS_IMPRTY_RSN_DTLS
     */
    private String prcsImprtyRsnDtls;

    /**
     * 차체 길이 - CBD_LT
     */
    private String cbdLt;

    /**
     * 차체 너비 - CBD_BT
     */
    private String cbdBt;

    /**
     * 차체 높이 - CBD_HG
     */
    private String cbdHg;

    /**
     * 최초 최대 적재량 - FRST_MXMM_LDG
     */
    private String frstMxmmLdg;

    /**
     * 연료 소비율 - FUEL_CNSMPRT
     */
    private String fuelCnsmprt;

    /**
     * 전기 복합 연료 소비율 - ELCTY_CMPND_FUEL_CNSMPRT
     */
    private String elctyCmpndFuelCnsmprt;

    /**
     * 자동차 과태료 대상 ID - CAR_FFNLG_TRGT_ID
     */
    private String carFfnlgTrgtId;

    /**
     * 등록 일시 - REG_DT
     */
    private LocalDateTime regDt;

    /**
     * 등록자 - RGTR
     */
    private String rgtr;

    /**
     * 대표소유자 성명 - RPRS_OWNR_NM
     */
    private String rprsOwnrNm;

    /**
     * OldBasicRequest에서 VO로 변환 (최초 요청 로그 저장용)
     *
     * @param request OldBasicRequest 요청 객체
     * @return 초기 요청 정보가 담긴 VO
     */
    public static CarBassMatterInqireVO fromOldRequest(OldBasicRequest request) {
        if (request == null) {
            return null;
        }

        // record 배열에서 첫 번째 요청 데이터 추출
        OldBasicRequest.Record record = null;
        if (request.getRecord() != null && !request.getRecord().isEmpty()) {
            record = request.getRecord().get(0);
        }

        CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
                // 헤더 정보 (request 외부 클래스에서)
                .infoSysId(request.getInfoSysId())           // INFO_SYS_ID → infoSysId
                .infoSysIpAddr(request.getInfoSysIp())       // INFO_SYS_IP → infoSysIpAddr
                .sggCd(request.getSigunguCode())             // SIGUNGU_CODE → sggCd
                .linkInfoCd(request.getCntcInfoCode())       // CNTC_INFO_CODE → linkInfoCd
                .picId(request.getChargerId())               // CHARGER_ID → picId
                .picIpAddr(request.getChargerIp())           // CHARGER_IP → picIpAddr
                .picNm(request.getChargerNm());              // CHARGER_NM → picNm

        // 요청 본문 정보 (request.record[0]에서)
        if (record != null) {
            builder
                    .dmndLevyCrtrYmd(record.getLevyStdde())     // LEVY_STDDE → dmndLevyCrtrYmd
                    .dmndInqSeCd(record.getInqireSeCode())      // INQIRE_SE_CODE → dmndInqSeCd
                    .dmndVhrno(record.getVhrno())               // VHRNO → dmndVhrno
                    .dmndVin(record.getVin());                  // VIN → dmndVin
        }

        return builder.build();
    }

    /**
     * ApiExchangeEnvelope<OldBasicRequest, OldBasicResponse>에서 VO로 변환 (응답 업데이트용)
     *
     * @param generatedId 생성된 PK ID
     * @param envelope API 응답 Envelope
     * @return 응답 정보가 담긴 VO
     */
    public static CarBassMatterInqireVO fromOldExchange(
            String generatedId,
            ApiExchangeEnvelope<OldBasicRequest, OldBasicResponse> envelope) {

        if (envelope == null || envelope.getResponse() == null) {
            return null;
        }

        Envelope<OldBasicResponse> response = envelope.getResponse();
        List<OldBasicResponse> data = response.getData();

        if (data == null || data.isEmpty()) {
            return null;
        }

        OldBasicResponse firstData = data.get(0);
        List<OldBasicResponse.Record> records = firstData.getRecord();

        // 응답 정보 업데이트용 VO 빌드
        CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
                .carBassMatterInqireId(generatedId)
                .txId(envelope.getTxId())
                .linkRsltCd(firstData.getCntcResultCode())
                .linkRsltDtl(firstData.getCntcResultDtls());

        // record가 있는 경우 첫 번째 record의 상세 정보 매핑
        if (records != null && !records.isEmpty()) {
            OldBasicResponse.Record record = records.get(0);

            builder
                    .yridnw(record.getPrye())
                    .regYmd(record.getRegistDe())
                    .ersrRegSeCd(record.getErsrRegistSeCode())
                    .ersrRegSeNm(record.getErsrRegistSeNm())
                    .ersrRegYmd(record.getErsrRegistDe())
                    .regDtlCd(record.getRegistDetailCode())
                    .dsplvl(record.getDsplvl())
                    .usgsrhldStdgCd(record.getUseStrnghldLegaldongCode())
                    .usgsrhldDongCd(record.getUseStrnghldAdstrdCode())
                    .usgsrhldMtnYn(record.getUseStrnghldMntn())
                    .usgsrhldLnbr(record.getUseStrnghldLnbr())
                    .usgsrhldHo(record.getUseStrnghldHo())
                    .usgsrhldAddrNm(record.getUseStrnghldAdresNm())
                    .usgsrhldRoadNmCd(record.getUseStrnghldRoadNmCode())
                    .usgsrhldUdgdBldgSeCd(record.getUsgsrhldUndgrndBuldSeCode())
                    .usgsrhldBmno(record.getUseStrnghldBuldMainNo())
                    .usgsrhldBsno(record.getUseStrnghldBuldSubNo())
                    .usgsrhldWholAddr(record.getUsgsrhldAdresFull())
                    .rprsOwnrMbrSeCd(record.getMberSeCode())
                    .rprsOwnrNm(record.getMberNm())
                    .rprsvOwnrIdecno(record.getMberSeNo())
                    .rprsOwnrTelno(record.getTelno())
                    .ownrStdgCd(record.getOwnerLegaldongCode())
                    .ownrDongCd(record.getOwnerAdstrdCode())
                    .ownrMtnYn(record.getOwnerMntn())
                    .ownrLnbr(record.getOwnerLnbr())
                    .ownrHo(record.getOwnerHo())
                    .ownrAddrNm(record.getOwnerAdresNm())
                    .ownrRoadNmCd(record.getOwnerRoadNmCode())
                    .ownrUdgdBldgSeCd(record.getOwnerUndgrndBuldSeCode())
                    .ownrBmno(record.getOwnerBuldMainNo())
                    .ownrBsno(record.getOwnerBuldSubNo())
                    .ownrWholaddr(record.getOwnerAdresFull())
                    .rearVhrno(record.getAftrVhrno())
                    .useFuelCd(record.getUseFuelCode())
                    .usgSeCd(record.getPrposSeCode())
                    .mtrsFomNm(record.getMtrsFomNm())
                    .bfrVhrno(record.getFrntVhrno())
                    .vhrno(record.getVhrno())
                    .vin(record.getVin())
                    .atmbNm(record.getCnm())
                    .vhclTotlWt(record.getVhcleTotWt())
                    .veagEndYmd(record.getCaagEndde())
                    .chgYmd(record.getChangeDe())
                    .carmdlAsortCd(record.getVhctyAsortCode())
                    .carmdlTypeCd(record.getVhctyTyCode())
                    .carmdlSeCd(record.getVhctySeCode())
                    .mxmmLdg(record.getMxmmLdg())
                    .carmdlAsortNm(record.getVhctyAsortNm())
                    .carmdlTypeNm(record.getVhctyTyNm())
                    .carmdlClsfNm(record.getVhctySeNm())
                    .frstRegYmd(record.getFrstRegistDe())
                    .fomNm(record.getFomNm())
                    .acqsYmd(record.getAcqsDe())
                    .acqsEndYmd(record.getAcqsEndDe())
                    .fbctnYmd(record.getYblMd())
                    .transrRegYmd(record.getTransrRegistDe())
                    .spcfRegSttsCd(record.getSpcfRegistSttusCode())
                    .colorNm(record.getColorNm())
                    .mrtgCnt(record.getMrtgCo())
                    .szrCnt(record.getSeizrCo())
                    .strctChgCnt(record.getStmdCo())
                    .nopltCsdyYn(record.getNmplCsdyAt())
                    .nopltCsdyAvtsmtYmd(record.getNmplCsdyRemnrDe())
                    .srcSeCd(record.getOriginSeCode())
                    .nopltSpcfctCd(record.getNmplStndrdCode())
                    .acqsAmt(record.getAcqsAmount())
                    .inspVldPdBgngYmd(record.getInsptValidPdBgnde())
                    .inspVldPdEndYmd(record.getInsptValidPdEndde())
                    .usgsrhldGrcCd(record.getUseStrnghldGrcCode())
                    .rdcpctCnt(record.getTkcarPscapCo())
                    .spmnno(record.getSpmnno())
                    .drvngDstnc(record.getTrvlDstnc())
                    .frstRegAplyRcptNo(record.getFrstRegistRqrcno())
                    .vlntErsrPrvntcAvtsmtYmd(record.getVlntErsrPrvntcNticeDe())
                    .ognzNm(record.getRegistInsttNm())
                    .prcsImprtyRsnCd(record.getProcessImprtyResnCode())
                    .prcsImprtyRsnDtls(record.getProcessImprtyResnDtls())
                    .cbdLt(record.getCbdLt())
                    .cbdBt(record.getCbdBt())
                    .cbdHg(record.getCbdHg())
                    .frstMxmmLdg(record.getFrstMxmmLdg())
                    .fuelCnsmprt(record.getFuelCnsmpRt())
                    .elctyCmpndFuelCnsmprt(record.getElctyCmpndFuelCnsmpRt());
        }

        return builder.build();
    }

    /**
     * NewBasicRequest에서 VO로 변환 (요청 초기 저장용)
     *
     * @param request 신규 API 요청 객체
     * @return 요청 정보가 담긴 VO
     */
    public static CarBassMatterInqireVO fromNewRequest(NewBasicRequest request) {
        if (request == null) {
            return null;
        }

        // 공통 메타 정보 매핑
        CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
                .infoSysId(request.getInfoSysId())
                .infoSysIpAddr(request.getInfoSysIpAddr())
                .sggCd(request.getSggCd())
                .linkInfoCd(request.getLinkInfoCd())
                .picId(request.getPicId())
                .picIpAddr(request.getPicIpAddr())
                .picNm(request.getPicNm());

        // record가 있는 경우 첫 번째 record의 요청 정보 매핑
        if (request.getRecord() != null && !request.getRecord().isEmpty()) {
            NewBasicRequest.Record record = request.getRecord().get(0);
            builder
                    .dmndLevyCrtrYmd(record.getLevyCrtrYmd())     // 과태료 기준일자
                    .dmndInqSeCd(record.getInqSeCd())            // 조회 구분 코드
                    .dmndVhrno(record.getVhrno())                // 차량번호
                    .dmndVin(record.getVin());                   // 차대번호
        }

        return builder.build();
    }

    /**
     * ApiExchangeEnvelope<NewBasicRequest, NewBasicResponse>에서 VO로 변환 (응답 업데이트용)
     *
     * @param generatedId 생성된 PK ID
     * @param envelope API 응답 Envelope
     * @return 응답 정보가 담긴 VO
     */
    public static CarBassMatterInqireVO fromNewExchange(
            String generatedId,
            ApiExchangeEnvelope<NewBasicRequest, NewBasicResponse> envelope) {

        if (envelope == null || envelope.getResponse() == null) {
            return null;
        }

        Envelope<NewBasicResponse> response = envelope.getResponse();
        List<NewBasicResponse> data = response.getData();

        if (data == null || data.isEmpty()) {
            return null;
        }

        NewBasicResponse firstData = data.get(0);
        List<NewBasicResponse.Record> records = firstData.getRecord();

        // 응답 정보 업데이트용 VO 빌드
        CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
                .carBassMatterInqireId(generatedId)
                .txId(envelope.getTxId())
                .linkRsltCd(firstData.getLinkRsltCd())
                .linkRsltDtl(firstData.getLinkRsltDtl());

        // record가 있는 경우 첫 번째 record의 상세 정보 매핑
        if (records != null && !records.isEmpty()) {
            NewBasicResponse.Record record = records.get(0);

            builder
                    .yridnw(record.getYridnw())
                    .regYmd(record.getRegYmd())
                    .ersrRegSeCd(record.getErsrRegSeCd())
                    .ersrRegSeNm(record.getErsrRegSeNm())
                    .ersrRegYmd(record.getErsrRegYmd())
                    .regDtlCd(record.getRegDtlCd())
                    .dsplvl(record.getDsplvl())
                    .usgsrhldStdgCd(record.getUsgsrhldStdgCd())
                    .usgsrhldDongCd(record.getUsgsrhldDongCd())
                    .usgsrhldMtnYn(record.getUsgsrhldMtnYn())
                    .usgsrhldLnbr(record.getUsgsrhldLnbr())
                    .usgsrhldHo(record.getUsgsrhldHo())
                    .usgsrhldAddrNm(record.getUsgsrhldAddrNm())
                    .usgsrhldRoadNmCd(record.getUsgsrhldRoadNmCd())
                    .usgsrhldUdgdBldgSeCd(record.getUsgsrhldUdgdBldgSeCd())
                    .usgsrhldBmno(record.getUsgsrhldBmno())
                    .usgsrhldBsno(record.getUsgsrhldBsno())
                    .usgsrhldWholAddr(record.getUsgsrhldWholAddr())
                    .rprsOwnrMbrSeCd(record.getRprsOwnrMbrSeCd())
                    .rprsOwnrNm(record.getRprsOwnrNm())
                    .rprsvOwnrIdecno(record.getRprsvOwnrIdecno())
                    .rprsOwnrTelno(record.getRprsOwnrTelno())
                    .ownrStdgCd(record.getOwnrStdgCd())
                    .ownrDongCd(record.getOwnrDongCd())
                    .ownrMtnYn(record.getOwnrMtnYn())
                    .ownrLnbr(record.getOwnrLnbr())
                    .ownrHo(record.getOwnrHo())
                    .ownrAddrNm(record.getOwnrAddrNm())
                    .ownrRoadNmCd(record.getOwnrRoadNmCd())
                    .ownrUdgdBldgSeCd(record.getOwnrUdgdBldgSeCd())
                    .ownrBmno(record.getOwnrBmno())
                    .ownrBsno(record.getOwnrBsno())
                    .ownrWholaddr(record.getOwnrWholAddr())
                    .rearVhrno(record.getRearVhrno())
                    .useFuelCd(record.getUseFuelCd())
                    .usgSeCd(record.getUsgSeCd())
                    .mtrsFomNm(record.getMtrsFomNm())
                    .bfrVhrno(record.getBfrVhrno())
                    .vhrno(record.getVhrno())
                    .vin(record.getVin())
                    .atmbNm(record.getAtmbNm())
                    .vhclTotlWt(record.getVhclTotlWt())
                    .veagEndYmd(record.getVeagEndYmd())
                    .chgYmd(record.getChgYmd())
                    .carmdlAsortCd(record.getCarmdlAsortCd())
                    .carmdlTypeCd(record.getCarmdlTypeCd())
                    .carmdlSeCd(record.getCarmdlSeCd())
                    .mxmmLdg(record.getMxmmLdg())
                    .carmdlAsortNm(record.getCarmdlAsortNm())
                    .carmdlTypeNm(record.getCarmdlTypeNm())
                    .carmdlClsfNm(record.getCarmdlClsfNm())
                    .frstRegYmd(record.getFrstRegYmd())
                    .fomNm(record.getFomNm())
                    .acqsYmd(record.getAcqsYmd())
                    .acqsEndYmd(record.getAcqsEndYmd())
                    .fbctnYmd(record.getFbctnYmd())
                    .transrRegYmd(record.getTransrRegYmd())
                    .spcfRegSttsCd(record.getSpcfRegSttsCd())
                    .colorNm(record.getColorNm())
                    .mrtgCnt(record.getMrtgCnt())
                    .szrCnt(record.getSzrCnt())
                    .strctChgCnt(record.getStrctChgCnt())
                    .nopltCsdyYn(record.getNoplTcsdyYn())
                    .nopltCsdyAvtsmtYmd(record.getNoplTcsdyAvtsmtYmd())
                    .srcSeCd(record.getSrcSeCd())
                    .nopltSpcfctCd(record.getNoplTSpcfctCd())
                    .acqsAmt(record.getAcqsAmt())
                    .inspVldPdBgngYmd(record.getInspVldPdBgngYmd())
                    .inspVldPdEndYmd(record.getInspVldPdEndYmd())
                    .usgsrhldGrcCd(record.getUsgsrhldGrcCd())
                    .rdcpctCnt(record.getRdcpctCnt())
                    .spmnno(record.getSpmnno())
                    .drvngDstnc(record.getDrvngDstnc())
                    .frstRegAplyRcptNo(record.getFrstRegAplyRcptNo())
                    .vlntErsrPrvntcAvtsmtYmd(record.getVlntErsrPrvntcAvtsmtYmd())
                    .ognzNm(record.getOgnzNm())
                    .prcsImprtyRsnCd(record.getPrcsImprtyRsnCd())
                    .prcsImprtyRsnDtls(record.getPrcsImprtyRsnDtls())
                    .cbdLt(record.getCbdLt())
                    .cbdBt(record.getCbdBt())
                    .cbdHg(record.getCbdHg())
                    .frstMxmmLdg(record.getFrstMxmmLdg())
                    .fuelCnsmprt(record.getFuelCnsmprt())
                    .elctyCmpndFuelCnsmprt(record.getElctyCmpndFuelCnsmprt());
        }

        return builder.build();
    }
}
