package kr.xit.biz.ens.model;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.validation.constraints.Digits;
import javax.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;

import io.swagger.v3.oas.annotations.media.Schema;
import kr.xit.biz.common.ApiConstants;
import kr.xit.biz.ens.model.cmm.CmmEnsRequestDTO;
import kr.xit.biz.ens.model.nice.NiceCiDTO;
import kr.xit.core.biz.model.AuditFields;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;

/**
 * <pre>
 * description : tb_ens_ Entity DTO
 *
 * packageName : kr.xit.biz.ens.model
 * fileName    : EnsDTO
 * author      : limju
 * date        : 2023-08-31
 * ======================================================================
 * 변경일         변경자        변경 내용
 * ----------------------------------------------------------------------
 * 2023-08-31    limju       최초 생성
 *
 * </pre>
 */
public class EnsDTO {
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = true)
    public static class BatchEnsRequest extends CmmEnsRequestDTO {
        /**
         * 발송 처리 상태
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "발송처리상태", example = " ")
        @Size(max = 5)
        private String sndngProcessSttus;

        /**
         * 배치실행주기 - day|hour
         */
        @Schema(hidden = true, requiredMode = Schema.RequiredMode.AUTO, title = "배치실행주기", example = "day|hour")
        private String batchPeriod;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = true)
    public static class SendKakaoTgt extends EnsDTO.KakaoMyDoc {

        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;

        /**
         * 통합 발송 마스터 id
         */
        private String unitySndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 템플릿 ID
         */
        private String tmplatId;
        /**
         * 발송 유형 코드
         */
        private String sndngTyCode;
        /**
         * 발송 건수
         */
        private int sndngCo;
        /**
         * 발송 처리 상태
         */
        //private String sndngProcessSttus;

        /**
         * ci
         */
        private String ci;

        /**
         * 마감 일시
         */
        private long closDt;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = true)
    public static class SendKakaotalkTgt extends EnsDTO.KakaotalkD10 {

        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;

        /**
         * 통합 발송 마스터 id
         */
        private String unitySndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 템플릿 ID
         */
        private String tmplatId;
        /**
         * 발송 유형 코드
         */
        private String sndngTyCode;
        /**
         * 발송 건수
         */
        private int sndngCo;
        /**
         * 발송 처리 상태
         */
        //private String sndngProcessSttus;

        /**
         * ci
         */
        private String ci;

        /**
         * 마감 일시
         */
        private String closDt;
    }


    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @SuperBuilder
    public static class UnitySndngMst implements Serializable {

        /**
         * 통합 발송 마스터 id
         */
        private String unitySndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 템플릿 ID
         */
        private String tmplatId;
        /**
         * 발송 유형 코드
         */
        private String sndngTyCode;
        /**
         * 발송 건수
         */
        private int sndngCo;
        /**
         * 발송 처리 상태
         */
        private String sndngProcessSttus;
        /**
         * 발송 일시
         */
        private String sndngDt1;
        /**
         * 발송 일시 2
         */
        private String sndngDt2;
        /**
         * 발송 일시 3
         */
        private String sndngDt3;
        /**
         * try1
         */
        private String try1;
        /**
         * try2
         */
        private String try2;
        /**
         * try3
         */
        private String try3;
        /**
         * try_cnt
         */
        private int tryCnt;
        /**
         * 마감 일시
         */
        private String closDt;
        /**
         * 에러 코드
         */
        private String errorCode;
        /**
         * 에러 메시지
         */
        private String errorMssage;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = false)
    public static class UnitySndngDtl extends AuditFields implements Serializable {

        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;
        /**
         * 통합 발송 마스터 id
         */
        private String unitySndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 메인 코드
         */
        private String mainCode;
        /**
         * 차량번호
         */
        private String vhcleNo;
        /**
         * 주민등록번호
         */
        private String ihidnum;
        /**
         * 핸드폰 번호
         */
        private String moblphonNo;
        /**
         * 성명
         */
        private String nm;
        /**
         * 주소
         */
        private String adres;
        /**
         * 상세 주소
         */
        private String detailAdres;
        /**
         * 우편번호
         */
        private String zip;
        /**
         * 템플릿 메시지 데이터
         */
        private String tmpltMsgData;
        /**
         * 모바일 페이지 내용
         */
        private String mobilePageCn;
        /**
         * 이용 기관 식별 ID
         */
        private String useInsttIdntfcId;
        /**
         * 외부 문서 식별 번호
         */
        private String externalDocumentUuid;
    }
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = false)
    public static class KakaoMyDoc extends AuditFields implements Serializable {

        /**
         * 발송 상세 id
         */
        private String sndngDetailId;
        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;
        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 제목
         */
        private String title;
        /**
         * 해쉬
         */
        private String hash;
        /**
         * 메타 정보
         */
        private String commonCategories;
        /**
         * 처리 마감 시간
         */
        private double readExpiredAt;
        /**
         * 받는 이 ci
         */
        private String recvCi;
        /**
         * 받는 이 전화번호
         */
        private String recvPhoneNumber;
        /**
         * 받는 이 성명
         */
        private String recvName;
        /**
         * 받는 이 생년월일
         */
        private String recvBirthday;
        /**
         * 성명 검증 옵션
         */
        private String recvIsRequiredVerifyName;
        /**
         * 모바일 페이지 URL
         */
        private String propLink;
        /**
         * payload
         */
        private String propPayload;
        /**
         * 메시지
         */
        private String propMessage;
        /**
         * 고객센터 전화번호
         */
        private String propCsNumber;
        /**
         * 고객센터 명
         */
        private String propCsName;
        /**
         * 외부 문서 식별 번호
         */
        private String externalDocumentUuid;
        /**
         * 내부 문서 식별 번호
         */
        private String documentBinderUuid;
        /**
         * 에러 코드
         */
        private String errorCode;
        /**
         * 에러 메시지
         */
        private String errorMessage;
        /**
         * 진행 상태
         */
        private String docBoxStatus;
        /**
         * 송신 시간
         */
        private String docBoxSentAt;
        /**
         * 수신 시간
         */
        private String docBoxReceivedAt;
        /**
         * 최초 열람 인증 시간
         */
        private String authenticatedAt;
        /**
         * 최초 OTT 검증 시간
         */
        private String tokenUsedAt;
        /**
         * 최초 열람 시간
         */
        private String docBoxReadAt;
        /**
         * 알림톡 수신 시간
         */
        private String userNotifiedAt;

    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = false)
    public static class KakaotalkD10 extends AuditFields implements Serializable {

        /**
         * 발송 상세 id
         */
        private String sndngDetailId;
        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;
        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;

        /**
         * 발송할 문서의 제목 : 필수
         */
        private String title;

        /**
         * 최초 열람 만료 일시 - 카카오톡 메시지를 수신한 사용자가 전자문서를 열람을 할 수 있는 시간
         * 요청 일시로부터 6개월 이내
         */
        private String readExpiresAt;

        /**
         * 재열람 만료 일시 - 권장값: 최대값은 요청 일시로부터 6개월 이내
         * 9999-12-31T23:59:59, null로 설정 시 무제한
         */
        private String reviewExpiresAt;

        /**
         * 문서 원문(열람정보)에 대한 hash 값 - 공인전자문서 유통정보 등록 시 필수
         */
        private String hash;

        /**
         * 받는이에 대한 정보 - 필수
         */

        /**
         * 받는이 CI
         */
        private String ci;

        /**
         * 받는이 전화번호
         * ci 미전송시 필수
         */
        private String phoneNumber;

        /**
         * 받는 이 이름
         * ci 미전송시 필수
         */
        private String name;

        /**
         * 받는 이 생년월일 (YYYYMMDD 형식)
         * ci 미전송시 필수
         */
        private String birthday;

        /**
         * 이용기관에서 해당 값을 다시 받고자 할 내용의 값
         */
        private String payload;

        /**
         * 이용기관에서 해당 값을 다시 받고자 할 내용의 값
         */
        private Boolean useNonPersonalizedNotification;

        /**
         * 이용기관에서 해당 값을 다시 받고자 할 내용의 값
         */
        private String externalId;

        /**
         * 메세지 - 사용자에게 전송하는 문서에 대한 설명
         * 노출위치 : 문서수신 메시지(알림톡)가 도착했음을 알리는 카카오톡 메시지 내부
         */
        private String guide;

        /**
         * 본인인증 후 사용자에게 보여줄 웹페이지 주소 : 필수
         */
        private String contentLink;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @EqualsAndHashCode(callSuper = false)
    public static class PostSndng extends AuditFields implements Serializable {

        /**
         * 통합 발송 마스터 id
         */
        private String unitySndngMastrId;
        /**
         * 발송 상세 id
         */
        private String sndngDetailId;
        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;
        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 서비스 코드
         */
        private String serviceCd;
        /**
         * 연계 식별 키
         */
        private String conKey;
        /**
         * 발송인 명
         */
        private String senderNm;
        /**
         * 발송인 우편번호
         */
        private String senderZipNo;
        /**
         * 발송인 주소
         */
        private String senderAddr;
        /**
         * 발송인 상세 주소
         */
        private String senderDetailAddr;
        /**
         * 수취인 일련 번호
         */
        private String receiverSendNo;
        /**
         * 수취인 명
         */
        private String receiverNm;
        /**
         * 수취인 우편번호
         */
        private String receiverZipNo;
        /**
         * 수취인 주소
         */
        private String receiverAddr;
        /**
         * 수취인 상세 주소
         */
        private String receiverDetailAddr;
        /**
         * 가변 1
         */
        private String sschnge1;
        /**
         * 가변 2
         */
        private String sschnge2;
        /**
         * 가변 3
         */
        private String sschnge3;
        /**
         * 발송 처리 상태
         */
        private String sndngProcessSttus;
    }

    @Schema(name = "sndngValidation", description = "Accept 요청 결과 DTO")
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    public static class SndngValidation {
        /* mastr */
        private String unitySndngDetailId;

        /**
         * 시군구 코드
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "시군구 코드 (max:5)", example = " ")
        @Size(max = 5)
        private String signguCode;
        /**
         * 과태료 코드
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "과태료 코드 (max:2)", example = " ")
        @Size(max = 2)
        private String ffnlgCode;
        /**
         * 템플릿 ID
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "템플릿 ID (max:5)", example = " ")
        @Size(max = 5)
        private String tmplatId;
        /**
         * 발송 유형 코드
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송 유형 코드 (max:3)", example = " ")
        @Size(max = 3)
        private String sndngTyCode;
        /**
         * 발송 건수
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송 건수 (max:8자리)", example = " ")
        @Digits(integer = 8, fraction = 0, message = "발송 건수는 필수입니다(max:8자리)")
        private int sndngCo;
        /**
         * 발송 일시
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "발송 일시 (max:14)", example = " ")
        @Size(max = 14)
        private String sndngDt;
        /**
         * 마감 일시
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "마감 일시 (max:14)", example = " ")
        @Size(max = 14)
        private String closDt;

        /* detail */
        /**
         * 메인 코드
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "메인 코드 (max:30)", example = " ")
        @Size(max = 30, message = "메인 코드 (max:30)")
        private String mainCode;
        /**
         * 차량 번호
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "차량 번호 (max:30)", example = " ")
        @Size(max = 30)
        private String vhcleNo;
        /**
         * 성명
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "성명 (max:200)", example = " ")
        @Size(max = 200)
        private String nm;
        /**
         * 시군구 코드(detail)
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "시군구 코드 detail (max:5)", example = " ")
        @Size(max = 5)
        private String signguCodeDe;
        /**
         * 과태료 코드(detail)
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "과태료 코드 detail (max:2)", example = " ")
        @Size(max = 2)
        private String ffnlgCodeDe;
        /* other */
        /**
         * 주민등록번호
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "주민등록번호 (max:100)", example = " ")
        @Size(max = 100)
        private String ihidnum;
        private String encIhidnum;

        /**
         * 핸드폰 번호
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "핸드폰 번호 (max:20)", example = " ")
        @Size(max = 20)
        private String moblphonNo;
        /**
         * 모바일 페이지 내용
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "모바일 페이지 내용", example = " ")
        private String mobilePageCn;
        /**
         * 주소
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "주소 (max:300)", example = " ")
        @Size(max = 300)
        private String adres;
        /**
         * 상세 주소
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "상세 주소 (max:300)", example = " ")
        @Size(max = 300)
        private String detailAdres;
        /**
         * 우편번호
         */
        @Schema(requiredMode = Schema.RequiredMode.AUTO, title = "우편번호 (max:5)", example = " ")
        @Size(max = 5)
        private String zip;
        /**
         * try1
         */
        private String try1;
        /**
         * try2
         */
        private String try2;
        /**
         * try3
         */
        private String try3;
        private int trySeq;

        /**
         * ci
         */
        private String ci;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class SmsSndng implements Serializable {

        /**
         * 발송 상세 id
         */
        private String sndngDetailId;
        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;
        /**
         * 발송 마스터 id
         */
        private String sndngMastrId;
        /**
         * 시군구 코드
         */
        private String signguCode;
        /**
         * 과태료 코드
         */
        private String ffnlgCode;
        /**
         * 차량 번호
         */
        private String vhcleNo;
        /**
         * 문자 발송 일시
         */
        private String smsSndngDt;
        /**
         * 문자 전송 형태
         */
        private String smsTrnsmisStle;
        /**
         * 문자 송신 전화 번호
         */
        private String smsTrnsmitTlphonNo;
        /**
         * 문자 수신 전화 번호
         */
        private String smsRecptnTlphonNo;
        /**
         * 문자 메시지
         */
        private String smsMssage;
        /**
         * 문자 발송 상태
         */
        private String smsSndngSttus;
        /**
         * 문자 발송 처리 상태
         */
        private String smsSndngProcessSttus;
        /**
         * 등록 일시
         */
        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss.SSS")
        @JsonIgnore
        private LocalDateTime registDt;
        /**
         * 등록자
         */
        private String register;

        private String unitySndngMastrId;
        private String sndngProcessSttus;

    }



    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class NtcnCntcData implements Serializable {
        /**
         * 전자고지 연계 data id
         */
        private String ensCntcDataId;
        /**
         * 단속 일시
         */
        private String regltDt;
        /**
         * 차량 번호
         */
        private String vhcleNo;
        /**
         * 현장 명
         */
        private String sptNm;
        /**
         * 현장 별 코드
         */
        private String sptAcctoCode;
        /**
         * 파일 명
         */
        private String fileNm;
        /**
         * 처리 여부
         */
        private String processAt;
        /**
         * 대상 여부
         */
        private String trgetAt;
        /**
         * 통합 발송 상세 id
         */
        private String unitySndngDetailId;

        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss")
        private LocalDateTime registDt;
        /**
         * 등록자
         */
        private String register;

    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    public static class EnsNtncCntcSndngTgt implements Serializable {
        /**
         * 전자고지 연계 data id
         */
        private String ensCntcDataId;
        /**
         * 차량 번호
         */
        private String vhcleNo;
        /**
         * 처리 여부
         */
        private String processAt;
        /**
         * 대상여부
         */
        private String trgetAt;
        /**
         * 핸드폰 번호
         */
        private String moblphonNo;
        /**
         * 이름
         */
        private String nm;
        /**
         * 생년월일
         */
        private String brthdy;
        /**
         * 우편번호
         */
        private String zip;
        /**
         * 주소
         */
        private String adres;
        /**
         * 상세 주소
         */
        private String detailAdres;
        /**
         * 단속 일시
         */
        private String regltDt;
        /**
         * 현장 명
         */
        private String sptNm;
        /**
         * 마감일시
         */
        private String closDt;
        /*모바일 페이지 내용*/
        private String mobilePageCn;
        /*삭제여부*/
        private String deleteAt;
        /**
         * 발송건수
         */
        private int sndngCo;
        /**
         * 발송유형코드
         */
        @Builder.Default
        private String sndngTyCode = "ENS";
        /**
         * 템플릿 ID
         */
        private String tmplatId = "JU102";
        /**
         * 사전알림 데이타 생성 대상 여부
         */
        private String tgtYn;

        /**
         * 통합발송 마스터ID
         */
        private String unitySndngMastrId;
        /**
         * 통합발송 상세ID
         */
        private String unitySndngDetailId;
        /**
         * 발송처리상태
         */
        @Builder.Default
        private String sndngProcessSttus = ApiConstants.SndngProcessStatus.ACCEPT.getCode();
    }

    @Schema(name = "NiceCiRslt", description = "Nice CI 결과 DTO")
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuperBuilder
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @EqualsAndHashCode(callSuper = true)
    public static class NiceCiRslt extends NiceCiDTO.IpinCiResEncData {

        /**
         * 통합발송상세ID : 필수
         * 시설관리공단의 마스터key - unique key 이어야 함
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "통합발송상세ID")
        private String unitySndngDetailId;

        /**
         * code - error code
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "result")
        private String resultCd;

        /**
         * message - error message
         */
        @Schema(requiredMode = Schema.RequiredMode.REQUIRED, title = "message")
        private String message;

        /**
         * 등록 일시
         */
        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonFormat(pattern = "yyyy-MM-dd kk:mm:ss")
        private LocalDateTime registDt;
        /**
         * 등록자
         */
        private String register;
    }
}
