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

import go.kr.project.api.config.ApiConstant;
import go.kr.project.api.model.Envelope;
import go.kr.project.api.model.request.BasicRequest;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

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

    // ==== Static factory/mapping methods (moved from Service) ====
    public static VmisCarBassMatterInqireVO fromRequest(BasicRequest request) {
        return VmisCarBassMatterInqireVO.builder()
                .infoSysId(request.getInfoSysId())
                .infoSysIp(request.getInfoSysIp())
                .sigunguCode(request.getSigunguCode())
                .cntcInfoCode(request.getCntcInfoCode())
                .chargerId(request.getChargerId())
                .chargerIp(request.getChargerIp())
                .chargerNm(request.getChargerNm())
                .dmndLevyStdde(request.getLevyStdde())
                .dmndInqireSeCode(request.getInqireSeCode())
                .dmndVhrno(request.getVhrno())
                .dmndVin(request.getVin())
                .rgtr(ApiConstant.DEFAULT_REGISTRANT)
                .build();
    }

    public static VmisCarBassMatterInqireVO fromResponse(String id, Envelope<BasicResponse> envelope) {
        if (envelope == null || envelope.getData() == null || envelope.getData().isEmpty()) return null;
        BasicResponse response = envelope.getData().get(0);
        VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder builder = VmisCarBassMatterInqireVO.builder()
                .carBassMatterInqireId(id)
                .cntcResultCode(response.getCntcResultCode())
                .cntcResultDtls(response.getCntcResultDtls());
        if (response.getRecord() != null && !response.getRecord().isEmpty()) {
            BasicResponse.Record record = response.getRecord().get(0);
            applyRecord(builder, record);
        }
        return builder.build();
    }

    private static void applyRecord(VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder builder, BasicResponse.Record record) {
        builder
                .prye(record.getPrye())  // 연식
                .registDe(record.getRegistDe())  // 등록일
                .ersrRegistSeCode(record.getErsrRegistSeCode())  // 말소 등록 구분 코드
                .ersrRegistSeNm(record.getErsrRegistSeNm())  // 말소 등록 구분명
                .ersrRegistDe(record.getErsrRegistDe())  // 말소 등록일
                .registDetailCode(record.getRegistDetailCode())  // 등록 상세 코드
                .dsplvl(record.getDsplvl())  // 배기량
                .useStrnghldLegaldongCode(record.getUseStrnghldLegaldongCode())  // 사용 본거지 법정동 코드
                .useStrnghldAdstrdCode(record.getUseStrnghldAdstrdCode())  // 사용 본거지 행정동 코드
                .useStrnghldMntn(record.getUseStrnghldMntn())  // 사용 본거지 산
                .useStrnghldLnbr(record.getUseStrnghldLnbr())  // 사용 본거지 번지
                .useStrnghldHo(record.getUseStrnghldHo())  // 사용 본거지 호
                .useStrnghldAdresNm(record.getUseStrnghldAdresNm())  // 사용 본거지 상세주소
                .useStrnghldRoadNmCode(record.getUseStrnghldRoadNmCode())  // 사용 본거지 도로명 코드
                .usgsrhldUndgrndBuldSeCode(record.getUsgsrhldUndgrndBuldSeCode())  // 사용 본거지 지하 건물 구분 코드
                .useStrnghldBuldMainNo(record.getUseStrnghldBuldMainNo())  // 사용 본거지 건물 주요 번호
                .useStrnghldBuldSubNo(record.getUseStrnghldBuldSubNo())  // 사용 본거지 건물 부 번호
                .usgsrhldAdresFull(record.getUsgsrhldAdresFull())  // 사용 본거지 전체주소
                .mberSeCode(record.getMberSeCode())  // 대표소유자 회원 구분 코드
                .mberSeNo(record.getMberSeNo())  // 대표소유자 회원 번호
                .mberNm(record.getMberNm())  // 대표소유자 성명
                .telno(record.getTelno())  // 대표소유자 전화번호
                .ownerLegaldongCode(record.getOwnerLegaldongCode())  // 소유자 법정동 코드
                .ownerAdstrdCode(record.getOwnerAdstrdCode())  // 소유자 행정동 코드
                .ownerMntn(record.getOwnerMntn())  // 소유자 산
                .ownerLnbr(record.getOwnerLnbr())  // 소유자 번지
                .ownerHo(record.getOwnerHo())  // 소유자 호
                .ownerAdresNm(record.getOwnerAdresNm())  // 소유자 상세주소
                .ownerRoadNmCode(record.getOwnerRoadNmCode())  // 소유자 도로명 코드
                .ownerUndgrndBuldSeCode(record.getOwnerUndgrndBuldSeCode())  // 소유자 지하건물 구분 코드
                .ownerBuldMainNo(record.getOwnerBuldMainNo())  // 소유자 건물 주요 번호
                .ownerBuldSubNo(record.getOwnerBuldSubNo())  // 소유자 건물 부 번호
                .ownrWholaddr(record.getOwnerAdresFull())  // 소유자 전체주소
                .aftrVhrno(record.getAftrVhrno())  // 신 차량번호
                .useFuelCode(record.getUseFuelCode())  // 사용 연료 코드
                .prposSeCode(record.getPrposSeCode())  // 용도 구분 코드
                .mtrsFomNm(record.getMtrsFomNm())  // 원동기 형식명
                .frntVhrno(record.getFrntVhrno())  // 이전 차량번호
                .vhrno(record.getVhrno())  // 차량번호
                .vin(record.getVin())  // 차대번호
                .cnm(record.getCnm())  // 차명
                .vhcleTotWt(record.getVhcleTotWt())  // 차량 총 중량
                .caagEndde(record.getCaagEndde())  // 차령 만료일자
                .changeDe(record.getChangeDe())  // 차번호 변경시기
                .vhctyAsortCode(record.getVhctyAsortCode())  // 차종 종별 코드
                .vhctyTyCode(record.getVhctyTyCode())  // 차종 유형 코드
                .vhctySeCode(record.getVhctySeCode())  // 차종 분류 코드
                .mxmmLdg(record.getMxmmLdg())  // 최대 적재량
                .vhctyAsortNm(record.getVhctyAsortNm())  // 차종 종별명
                .vhctyTyNm(record.getVhctyTyNm())  // 차종 유형명
                .vhctySeNm(record.getVhctySeNm())  // 차종 분류명
                .frstRegistDe(record.getFrstRegistDe())  // 최초 등록일
                .fomNm(record.getFomNm())  // 형식
                .acqsDe(record.getAcqsDe())  // 취득 일자
                .acqsEndDe(record.getAcqsEndDe())  // 취득 종료일자
                .yblMd(record.getYblMd())  // 제작 년월일
                .transrRegistDe(record.getTransrRegistDe())  // 이전 등록일
                .spcfRegistSttusCode(record.getSpcfRegistSttusCode())  // 제원 등록 상태 코드
                .colorNm(record.getColorNm())  // 색상명
                .mrtgCo(record.getMrtgCo())  // 저당수
                .seizrCo(record.getSeizrCo())  // 압류건수
                .stmdCo(record.getStmdCo())  // 구조변경수
                .nmplCsdyAt(record.getNmplCsdyAt())  // 번호판 영치 여부
                .nmplCsdyRemnrDe(record.getNmplCsdyRemnrDe())  // 번호판 영치 최고일
                .originSeCode(record.getOriginSeCode())  // 출처 구분 코드
                .nmplStndrdCode(record.getNmplStndrdCode())  // 번호판 규격 코드
                .acqsAmount(record.getAcqsAmount())  // 취득 금액
                .insptValidPdBgnde(record.getInsptValidPdBgnde())  // 검사 유효 기간 시작일
                .insptValidPdEndde(record.getInsptValidPdEndde())  // 검사 유효 기간 종료일
                .useStrnghldGrcCode(record.getUseStrnghldGrcCode())  // 사용 본거지 관청 코드
                .tkcarPscapCo(record.getTkcarPscapCo())  // 승차정원수
                .spmnno(record.getSpmnno())  // 제원관리번호
                .trvlDstnc(record.getTrvlDstnc())  // 주행거리
                .frstRegistRqrcno(record.getFrstRegistRqrcno())  // 최초 등록 접수번호
                .vlntErsrPrvntcNticeDe(record.getVlntErsrPrvntcNticeDe())  // 예고통지일
                .registInsttNm(record.getRegistInsttNm())  // 등록 기관명
                .processImprtyResnCode(record.getProcessImprtyResnCode())  // 처리 불가 사유 코드
                .processImprtyResnDtls(record.getProcessImprtyResnDtls())  // 처리 불가 사유 명세
                .cbdLt(record.getCbdLt())  // 차체 길이
                .cbdBt(record.getCbdBt())  // 차체 너비
                .cbdHg(record.getCbdHg())  // 차체 높이
                .frstMxmmLdg(record.getFrstMxmmLdg())  // 최초 최대 적재량
                .fuelCnsmpRt(record.getFuelCnsmpRt())  // 연료 소비율
                .elctyCmpndFuelCnsmpRt(record.getElctyCmpndFuelCnsmpRt());  // 전기 복합 연료 소비율
    }

    /**
     * 자동차 기본 사항 조회 ID (PK)
     * 형식: CBMI000000000001
     */
    private String carBassMatterInqireId;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * 연계 결과 상세
     */
    private String cntcResultDtls;

    /**
     * 연식
     */
    private String prye;

    /**
     * 등록일
     */
    private String registDe;

    /**
     * 말소 등록 구분 코드
     */
    private String ersrRegistSeCode;

    /**
     * 말소 등록 구분명
     */
    private String ersrRegistSeNm;

    /**
     * 말소 등록일
     */
    private String ersrRegistDe;

    /**
     * 등록 상세 코드
     */
    private String registDetailCode;

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

    /**
     * 사용 본거지 법정동 코드
     */
    private String useStrnghldLegaldongCode;

    /**
     * 사용 본거지 행정동 코드
     */
    private String useStrnghldAdstrdCode;

    /**
     * 사용 본거지 산
     */
    private String useStrnghldMntn;

    /**
     * 사용 본거지 번지
     */
    private String useStrnghldLnbr;

    /**
     * 사용 본거지 호
     */
    private String useStrnghldHo;

    /**
     * 사용 본거지 상세주소
     */
    private String useStrnghldAdresNm;

    /**
     * 사용 본거지 도로명 코드
     */
    private String useStrnghldRoadNmCode;

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

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

    /**
     * 사용 본거지 건물 부 번호
     */
    private String useStrnghldBuldSubNo;

    /**
     * 사용 본거지 전체주소
     */
    private String usgsrhldAdresFull;

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

    /**
     * 대표소유자 회원 번호
     */
    private String mberSeNo;

    /**
     * 대표소유자 전화번호
     */
    private String telno;

    /**
     * 소유자 법정동 코드
     */
    private String ownerLegaldongCode;

    /**
     * 소유자 행정동 코드
     */
    private String ownerAdstrdCode;

    /**
     * 소유자 산
     */
    private String ownerMntn;

    /**
     * 소유자 번지
     */
    private String ownerLnbr;

    /**
     * 소유자 호
     */
    private String ownerHo;

    /**
     * 소유자 상세주소
     */
    private String ownerAdresNm;

    /**
     * 소유자 도로명 코드
     */
    private String ownerRoadNmCode;

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

    /**
     * 소유자 건물 주요 번호
     */
    private String ownerBuldMainNo;

    /**
     * 소유자 건물 부 번호
     */
    private String ownerBuldSubNo;

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

    /**
     * 신 차량번호
     */
    private String aftrVhrno;

    /**
     * 사용 연료 코드
     */
    private String useFuelCode;

    /**
     * 용도 구분 코드
     */
    private String prposSeCode;

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

    /**
     * 이전 차량번호
     */
    private String frntVhrno;

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

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

    /**
     * 차명
     */
    private String cnm;

    /**
     * 차량 총 중량
     */
    private String vhcleTotWt;

    /**
     * 차령 만료일자
     */
    private String caagEndde;

    /**
     * 차번호 변경시기
     */
    private String changeDe;

    /**
     * 차종 종별 코드
     */
    private String vhctyAsortCode;

    /**
     * 차종 유형 코드
     */
    private String vhctyTyCode;

    /**
     * 차종 분류 코드
     */
    private String vhctySeCode;

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

    /**
     * 차종 종별명
     */
    private String vhctyAsortNm;

    /**
     * 차종 유형명
     */
    private String vhctyTyNm;

    /**
     * 차종 분류명
     */
    private String vhctySeNm;

    /**
     * 최초 등록일
     */
    private String frstRegistDe;

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

    /**
     * 취득 일자
     */
    private String acqsDe;

    /**
     * 취득 종료일자
     */
    private String acqsEndDe;

    /**
     * 제작 년월일
     */
    private String yblMd;

    /**
     * 이전 등록일
     */
    private String transrRegistDe;

    /**
     * 제원 등록 상태 코드
     */
    private String spcfRegistSttusCode;

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

    /**
     * 저당수
     */
    private String mrtgCo;

    /**
     * 압류건수
     */
    private String seizrCo;

    /**
     * 구조변경수
     */
    private String stmdCo;

    /**
     * 번호판 영치 여부
     */
    private String nmplCsdyAt;

    /**
     * 번호판 영치 최고일
     */
    private String nmplCsdyRemnrDe;

    /**
     * 출처 구분 코드
     */
    private String originSeCode;

    /**
     * 번호판 규격 코드
     */
    private String nmplStndrdCode;

    /**
     * 취득 금액
     */
    private String acqsAmount;

    /**
     * 검사 유효 기간 시작일
     */
    private String insptValidPdBgnde;

    /**
     * 검사 유효 기간 종료일
     */
    private String insptValidPdEndde;

    /**
     * 사용 본거지 관청 코드
     */
    private String useStrnghldGrcCode;

    /**
     * 승차정원수
     */
    private String tkcarPscapCo;

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

    /**
     * 주행거리
     */
    private String trvlDstnc;

    /**
     * 최초 등록 접수번호
     */
    private String frstRegistRqrcno;

    /**
     * 예고통지일
     */
    private String vlntErsrPrvntcNticeDe;

    /**
     * 등록 기관명
     */
    private String registInsttNm;

    /**
     * 처리 불가 사유 코드
     */
    private String processImprtyResnCode;

    /**
     * 처리 불가 사유 명세
     */
    private String processImprtyResnDtls;

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

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

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

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

    /**
     * 연료 소비율
     */
    private String fuelCnsmpRt;

    /**
     * 전기 복합 연료 소비율
     */
    private String elctyCmpndFuelCnsmpRt;

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

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

    /**
     * 대표소유자 성명
     */
    private String mberNm;
}
