package com.eactive.eai.custom.alarm.ums.payload;

import com.google.gson.annotations.SerializedName;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Data
@Builder
@Getter
public class UmsRequestPayload {
    // MSG_IDNT_NO	string	메시지식별번호	50			O	"발송 구분을 위한 거래 번호 (GUID 권고)
    //GUID로 입력이 어려울시
    //어플리케이션코드(3자리)+난수 로 유니크한 ID로 채번 권고"
    @Length(min = 1, max = 50)
    @NotEmpty
    @SerializedName("MSG_IDNT_NO")
    @Builder.Default
    private String messageIdentityNo = String.format("APM-%s",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now()));

    // MSG_BZWK_CD	string	메시지업무코드	30			O	UMS에 등록된 메시지업무코드(AS-IS 템플릿ID)
    @NotEmpty
    @Length(min = 1, max = 30)
    @SerializedName("MSG_BZWK_CD")
    @Builder.Default
    private String msgBizWorkCode = UmsBizWorkCode.MONITORING.getCode();

    // 메시지업무파라미터내용 / 4000 / JSONObject
    // MSG_BZWK_PARAM_CTNT	object	메시지업무파라미터내용	4000				메시지업무코드의 템플릿에서 사용하는 변수와 변수값
    @NotNull
    @SerializedName("MSG_BZWK_PARAM_CTNT")
    private IUmsGsonObject content;

    // 발송예약일시 / 14 / 실 발송 일자(yyyyMMddHHmmss)
    // SND_RESR_DTTM	string	발송예약일시	14	20240418111500		O	실 발송 일자(현재시간)
    @Pattern(regexp = "^[0-9]{14}$")
    @NotEmpty
    @SerializedName("SND_RESR_DTTM")
    @Builder.Default
    private String sendReservationDatetime = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());

    // 휴대전화번호 / 44 / 휴대폰번호(평문, 암호화 둘다가능)
    // CPNO	string	휴대전화번호	44				"암호화 또는 평문 (safedb not rrno)
    //문자일 시 암호문
    //숫자일 시 전화번호
    //고객번호 또는 휴대전화번호 필수"
    @NotEmpty
    @Pattern(regexp = "^[0-9]{10,11}$")
    @SerializedName("CPNO")
    private String cellphone;

    // 발송부점코드 / 4 /
    // SND_BRCD	string	발송부점코드	4			O	0333
    @NotEmpty
    @SerializedName("SND_BRCD")
    @Builder.Default
    private String sendBranchCode = "0990";

    // 발송직원번호 / 7 / ECEB057(텔러번호?)
    // SND_EMPNO	string	발송직원번호	7			O	? 넣긴해야함
    @NotEmpty
    @SerializedName("SND_EMPNO")
    @Builder.Default
    private String sendEmployeeNo = "ECEB057";

    // SRVC_ID	string	서비스ID	11				요청단 측 서비스ID
    @NotEmpty
    @SerializedName("SRVC_ID")
    @Builder.Default
    private String serviceId = "eAPIM";

    // MSG_SND_CHNL_CD	string	메시지발송채널코드	2
    @SerializedName("MSG_SND_CHNL_CD")
    @NotNull
    @Builder.Default
    private ChannelCode msgSndChnlCd = ChannelCode.KM;

    // VALDTN_RSLT_CD	string	검증결과코드	2				00으로 고정
    @SerializedName("VALDTN_RSLT_CD")
    @NotEmpty
    @Builder.Default
    private String validationResultCode = "00";

    public enum ChannelCode {
        SM, // SMS
        LM, // LMS
        MM, // MMS
        KM, // 카카오-알림톡
        FM, // 카카오-친구톡
        SR, // RCS-SMS
        LR, // RCS-LMS
        MR, // RCS-MMS
        TR, // RCS-TEMPLATE
        IR, // RCS-IMAGE Template
        PM  // Push
    }
}

