package cokr.xit.fims.crdn;

import java.util.List;

import cokr.xit.base.file.FileInfo;
import cokr.xit.fims.payer.Payer;
import cokr.xit.foundation.AbstractEntity;
import cokr.xit.foundation.Assert;
import cokr.xit.foundation.data.Convert;
import cokr.xit.foundation.data.DataObject;
import cokr.xit.interfaces.lvis.v2406.LvisA01;
import lombok.Getter;
import lombok.Setter;

/**단속 자료 정보
 * @author leebj
 */
@Getter
@Setter
public class Crdn extends AbstractEntity {
	public static String INF_TYPE = "100";

	/** 단속 ID */
	private String crdnId;
	/** 시군구 코드 */
	private String sggCd;
	/** 업무 구분 코드 */
	private String taskSeCd;
	/** 단속 등록 구분 코드 */
	private String crdnRegSeCd;
	/** 단속 입력 구분 코드 */
	private String crdnInptSeCd;
    /** 민원 연계 여부 */
    private String cvlcptLinkYn;
    /** 민원 연계 테이블 명 */
    private String cvlcptLinkTblNm;
	/** 민원 연계 ID */
	private String cvlcptLinkId;
	/** 단속 구분 코드 */
	private String crdnSeCd;
	/** 납부자 ID */
	private String rtpyrId;
	/** 주소 일련번호 */
	private String addrSn;
	/** 단속 일자 */
	private String crdnYmd;
	/** 단속 시각 */
	private String crdnTm;
	/** 차량번호 */
	private String vhrno;
	/** 장비코드 */
	private String eqpCd;
	/** 단속 법정동 명 */
	private String crdnStdgNm;
	/** 단속 도로 명 */
	private String crdnRoadNm;
	/** 단속 장소 */
	private String crdnPlc;
	/** 상세 단속 장소 */
	private String dtlCrdnPlc;
	/** 조 ID */
	private String teamId;
	/** 위반 ID */
	private String vltnId;
	/** 단속 특별구역 코드 */
	private String crdnSpareaCd;
	/** 단속 시작 시각 */
	private String crdnBgngTm;
	/** 단속 종료 시간 */
	private String crdnEndTm;
	/** 단속 일련번호 */
	private String crdnSn;
	/** GPS X */
	private String gpsX;
	/** GPS Y */
	private String gpsY;
	/** 모자이크 X */
	private String moscX;
	/** 모자이크 Y */
	private String moscY;
	/** 견인 여부 */
	private String towngYn;
	/** 첨부 파일 수 */
	private Integer atchFileCnt;
	/** 차대번호 */
	private String vin;
	/** 말소등록일자 */
	private String ersrRegYmd;
	/** 차량 명 */
	private String vhclNm;
	/** 차량 색상 */
	private String vhclColr;
	/** 차량 승차정원 */
	private int vhclCpct;
	/** 사용 연료 코드 */
	private String useFuelCd;
	/** 과태료 차종 코드 */
	private String ffnlgCarmdlCd;
	/** 주차 가능 결과 코드 */
	private String prkPsbltyRsltCd;
	/** 위반 횟수 */
	private String vltnNmtm;
	/** 시간외 여부 */
	private String ovtmYn;
	/** 시간외 분할 여부 */
	private String ovtmPrttnYn;
	/** 과태료 단속 금액 */
	private Integer ffnlgCrdnAmt;
	/** 과태료 감경율 */
	private String ffnlgRdcrt;
	/** 과태료 금액 */
	private Integer ffnlgAmt;
	/** 사전통지 시작 일자 */
	private String advntceBgngYmd;
	/** 사전통지 납기 일자 */
	private String advntceDudtYmd;
	/** 사전통지 금액 */
	private Integer advntceAmt;
	/** 의견 제출 여부 */
	private String opnnSbmsnYn;
	/** 기타 내용 */
	private String etcCn;
	/** 부과 ID */
	private String levyId;
	/** 단속 상태 코드 */
	private String crdnSttsCd;
	/** 단속 상태 변경 일시 */
	private String crdnSttsChgDt;
	/** 가산 금액 */
	private Integer adtnAmt;
	/** 감경 금액 */
	private Integer minusAmt;
	/** 수납 금액 */
	private Integer rcvmtAmt;
	/** 이전 단속 ID */
	private String bfrCrdnId;
	/** 세외수입 단속 연계 여부 */
	private String nxrpCrdnLinkYn;
	/** 세외수입 단속 연계 사용자 ID */
	private String nxrpCrdnLinkUserId;
	/** 세외수입 단속 연계 일시 */
	private String nxrpCrdnLinkDt;
	/** 세외수입 대장 키 */
	private String nxrpAcbKey;
	/** 삭제 여부 */
	private String delYn;
	/** 삭제 일시 */
	private String delDt;
	/** 삭제자 */
	private String dltr;
	/** 삭제 사유 */
	private String delRsn;
	/** 위반코드 */
	private String vltnCd;
	/** 납부자 구분 코드 */
	private String rtpyrSeCd;
	/** 납부자 명 */
	private String rtpyrNm;
	/** 납부자 번호 */
	private String rtpyrNo;
	/** 납부자 우편번호 */
	private String zip;
	/** 납부자 주소 */
	private String addr;
	/** 납부자 상세주소 */
	private String dtlAddr;
	/** 부과 제외 구분 코드 */
	private String levyExclSeCd;
	/** 부과 제외 사유 코드 */
	private String levyExclRsnCd;
	/** 부과 제외 일자 */
	private String levyExclYmd;
	/** 조원1 */
	private String teamer1;
	/** 조원2 */
	private String teamer2;
	/** 조원3 */
	private String teamer3;
	/** 조원4 */
	private String teamer4;
	/** 클린파킹 키 */
	private String mmCode;

	private List<FileInfo> attachments;

	public void clearAttachments() {
		if (attachments != null) {
			for (FileInfo attachment: attachments)
				attachment.close();
			attachments.clear();
		}
		attachments = null;
	}

	public static final String location(Object obj) {
		if (Assert.isEmpty(obj)) return "";

		List<String> strs = null;
		if (obj instanceof DataObject info)
			strs = List.of(info.string("CRDN_STDG_NM"), info.string("CRDN_ROAD_NM"), info.string("CRDN_PLC"));
		else if (obj instanceof Crdn crdn)
			strs = List.of(crdn.crdnStdgNm, crdn.crdnRoadNm, crdn.crdnPlc);
		else
			throw new IllegalArgumentException("Either Crdn or DataObject accepted");

		return Assert.isEmpty(strs) ? "" :
			String.join(" ",
				strs.stream()
					.filter(str -> !Assert.isEmpty(str))
					.toList()
			);
	}

	public void setInfo(Payer payer) {
		if (payer == null) return;

		payer.setCrdnId(getCrdnId());
		LvisA01.BasicInfo vehicle = payer.getVehicleInfo();
		setSggCd(payer.getSggCd()); // 시군구 데이터 정리되면 지울 것
		setRtpyrId(!Assert.isEmpty(vehicle.getErsr_regist_de()) ? "" : payer.getRtpyrId());
		setRtpyrNm(payer.getRtpyrNm());
		setRtpyrSeCd(payer.getRtpyrSeCd());
		setRtpyrNo(payer.getRtpyrNo());
		setZip(payer.getZip());
		setAddr(payer.getAddr());
		setDtlAddr(payer.getDtlAddr());
		setAddrSn(payer.getAddrSn());

		setVin(vehicle.getVin());
		setVhclNm(vehicle.getCnm());
		setVhclColr(vehicle.getColor_nm());
		setVhclCpct(toInt(vehicle.getTkcar_pscap_co()));
		setUseFuelCd(vehicle.getUse_fuel_code());
		setFfnlgCarmdlCd(fineCarModel(vehicle.getVhcty_asort_code(), vehicle.getMxmm_ldg()));
		setErsrRegYmd(vehicle.getErsr_regist_de());
	}

	private static final String fineCarModel(String vhctyAsortCd, String mxmmLdg) {
		if (Assert.isEmpty(vhctyAsortCd)) return null;

		if ("3".equals(vhctyAsortCd)) {
			int weight = Convert.toInt(mxmmLdg);
			if (weight < 1) return null;

			vhctyAsortCd = weight <= 4000 ? "3-1" : "3-2";
		}

		return switch (vhctyAsortCd) {
		case "1" -> "11";   // 승용
		case "2" -> "12";   // 승합
		case "3-1" -> "13"; // 화물
		case "3-2" -> "14"; // 화물
		case "4" -> "15";   // 특수
		default -> throw new IllegalArgumentException("vhctyAsortCd: " + vhctyAsortCd);
		};
	}
}