package com.its.api.its.model.dto.cctv;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.its.api.its.model.entity.cctv.TbCctvCtlr;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import javax.validation.constraints.Pattern;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import java.io.Serializable;

/**
 * CCTV 제어기 DTO Class
 */
@Data
@Builder
@ApiModel("TbCctvCtlrDto(CCTV 제어기)")
public class TbCctvCtlrDto implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("CCTV 관리 번호")  // N NUMBER(10)
    @JsonProperty("cctv_mngm_nmbr")
    private Long cctvMngmNmbr;

    @ApiModelProperty("CCTV 제어기 ID")  // Y VARCHAR(30)
    @JsonProperty("cctv_ctlr_id")
    private String cctvCtlrId;

    @ApiModelProperty("CCTV 제어기 아이피")  // Y VARCHAR(20)
    @JsonProperty("cctv_ctlr_ip")
    private String cctvCtlrIp;

    @ApiModelProperty("CCTV 제어기 포트")  // Y VARCHAR(5)
    @JsonProperty("cctv_ctlr_port")
    private String cctvCtlrPort;

    @ApiModelProperty("CCTV 자막기 아이피")  // Y VARCHAR(20)
    @JsonProperty("cctv_capt_ip")
    private String cctvCaptIp;

    @ApiModelProperty("CCTV 자막기 포트")  // Y VARCHAR(5)
    @JsonProperty("cctv_capt_port")
    private String cctvCaptPort;

    @ApiModelProperty("CCTV 광장비 아이피")  // Y VARCHAR(20)
    @JsonProperty("cctv_fibr_ip")
    private String cctvFibrIp;

    @ApiModelProperty("CCTV 인코더 아이피")  // Y VARCHAR(20)
    @JsonProperty("cctv_encd_ip")
    private String cctvEncdIp;

    @ApiModelProperty("스트리밍 서버 아이피")  // Y VARCHAR(20)
    @JsonProperty("strm_svr_ip")
    private String strmSvrIp;

    @ApiModelProperty("스트리밍 서버 포트")  // Y VARCHAR(5)
    @JsonProperty("strm_svr_port")
    private String strmSvrPort;

    @ApiModelProperty("스트리밍 세션 명")  // Y VARCHAR(200)
    @JsonProperty("strm_sesn_nm")
    private String strmSesnNm;

    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
    @JsonProperty("x_crdn")
    private Double xCrdn;

    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
    @JsonProperty("y_crdn")
    private Double yCrdn;

    @ApiModelProperty("설치 위치 명")  // Y VARCHAR(40)
    @JsonProperty("istl_lctn_nm")
    private String istlLctnNm;

    @ApiModelProperty("설치 위치 주소")  // Y VARCHAR(200)
    @JsonProperty("istl_lctn_addr")
    private String istlLctnAddr;

    @ApiModelProperty("CCTV 채널")  // Y NUMBER(2)
    @JsonProperty("cctv_chnl")
    private Integer cctvChnl;

    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
    @JsonProperty("del_yn")
    private String delYn;

    @ApiModelProperty("최초 등록자 번호")  // Y VARCHAR(20)
    @JsonProperty("frst_regr_nmbr")
    private String frstRegrNmbr;

    @ApiModelProperty("최초 등록 일시")  // Y VARCHAR(14)
    @JsonProperty("frst_rgst_dt")
    private String frstRgstDt;

    @ApiModelProperty("최종 수정자 번호")  // Y VARCHAR(20)
    @JsonProperty("last_crpr_nmbr")
    private String lastCrprNmbr;

    @ApiModelProperty("최종 수정 일시")  // Y VARCHAR(14)
    @JsonProperty("last_crct_dt")
    private String lastCrctDt;

    @ApiModelProperty("링크ID")  // Y NUMBER(10)
    @JsonProperty("link_id")
    private Long linkId;

    @ApiModelProperty("노드ID")  // Y NUMBER(10)
    @JsonProperty("node_id")
    private Long nodeId;

    @ApiModelProperty("공단 CCTV ID")  // Y VARCHAR(10)
    @JsonProperty("cctv_id")
    private String cctvId;

    @ApiModelProperty("연계 포트")  // Y VARCHAR(5)
    @JsonProperty("rely_port")
    private String relyPort;

    @ApiModelProperty("스트리밍 RTSP 주소")  // Y VARCHAR(200)
    @JsonProperty("strm_rtsp_addr")
    private String strmRtspAddr;

    @ApiModelProperty("스트리밍 RTMP 주소")  // Y VARCHAR(200)
    @JsonProperty("strm_rtmp_addr")
    private String strmRtmpAddr;

    @ApiModelProperty("스트리밍 HTTP 주소")  // Y VARCHAR(200)
    @JsonProperty("strm_http_addr")
    private String strmHttpAddr;

    @ApiModelProperty("스트리밍 저장 주소")  // Y VARCHAR(200)
    @JsonProperty("strm_stor_addr")
    private String strmStorAddr;

    @ApiModelProperty("지역 코드")  // Y VARCHAR(7)
    @JsonProperty("area_cd")
    private String areaCd;

    @ApiModelProperty("CCTV 유형(1:제노시스,2:프로브디지터,3:영국전자)")  // Y VARCHAR(10)
    @JsonProperty("cctv_type")
    private String cctvType;

    @ApiModelProperty("CCTV 대체 영상")  // Y BLOB
    @JsonProperty("cctv_sbst_imgn")
    private byte[] cctvSbstImgn;

    @ApiModelProperty("CCTV 대체 표출 여부")  // Y CHAR(1)
    @JsonProperty("cctv_sbst_dspl_yn")
    private String cctvSbstDsplYn;

    @ApiModelProperty("CCTV 지역 구분")  // Y VARCHAR(7)
    @JsonProperty("cctv_area_dvsn")
    private String cctvAreaDvsn;

    @ApiModelProperty("내부 RTMP 주소")  // Y VARCHAR(200)
    @JsonProperty("intr_rtmp_addr")
    private String intrRtmpAddr;

    @ApiModelProperty("운영자 제어 여부")  // Y CHAR(1)
    @JsonProperty("syop_cntl_yn")
    private String syopCntlYn;

    // Code Description Field
    @ApiModelProperty("삭제 여부 설명")
    @JsonProperty("del_desc")    // DEL_YN
    private String delDesc;

    @ApiModelProperty("지역 코드 설명")
    @JsonProperty("area_desc")    // AREA_CD
    private String areaDesc;

    @ApiModelProperty("CCTV 대체 표출 여부 설명")
    @JsonProperty("cctv_sbst_dspl_desc")    // CCTV_SBST_DSPL_YN
    private String cctvSbstDsplDesc;

    @ApiModelProperty("운영자 제어 여부 설명")
    @JsonProperty("syop_cntl_desc")    // SYOP_CNTL_YN
    private String syopCntlDesc;

    @ApiModel("TbCctvCtlrUpdReq(CCTV 제어기 정보변경)")
    @Getter
    @Setter
    @ToString
    @NoArgsConstructor(access = AccessLevel.PROTECTED)
    public static class TbCctvCtlrUpdReq {

        @ApiModelProperty("CCTV 관리 번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
        @JsonProperty("cctv_mngm_nmbr")
        @PositiveOrZero
        private Long cctvMngmNmbr;

        @ApiModelProperty("CCTV 제어기 ID, Nullable = Y, VARCHAR(30)")  // Y VARCHAR(30)
        @JsonProperty("cctv_ctlr_id")
        @Size(min=1, max=30)
        private String cctvCtlrId;

        @ApiModelProperty("CCTV 제어기 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("cctv_ctlr_ip")
        @Size(min=1, max=20)
        private String cctvCtlrIp;

        @ApiModelProperty("CCTV 제어기 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
        @JsonProperty("cctv_ctlr_port")
        @Size(min=1, max=5)
        private String cctvCtlrPort;

        @ApiModelProperty("CCTV 자막기 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("cctv_capt_ip")
        @Size(min=1, max=20)
        private String cctvCaptIp;

        @ApiModelProperty("CCTV 자막기 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
        @JsonProperty("cctv_capt_port")
        @Size(min=1, max=5)
        private String cctvCaptPort;

        @ApiModelProperty("CCTV 광장비 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("cctv_fibr_ip")
        @Size(min=1, max=20)
        private String cctvFibrIp;

        @ApiModelProperty("CCTV 인코더 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("cctv_encd_ip")
        @Size(min=1, max=20)
        private String cctvEncdIp;

        @ApiModelProperty("스트리밍 서버 아이피, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("strm_svr_ip")
        @Size(min=1, max=20)
        private String strmSvrIp;

        @ApiModelProperty("스트리밍 서버 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
        @JsonProperty("strm_svr_port")
        @Size(min=1, max=5)
        private String strmSvrPort;

        @ApiModelProperty("스트리밍 세션 명, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("strm_sesn_nm")
        @Size(min=1, max=200)
        private String strmSesnNm;

        @ApiModelProperty("X 좌표, , NUMBER(11,8)")  // Y NUMBER(11,8)
        @JsonProperty("x_crdn")
        private Double xCrdn;

        @ApiModelProperty("Y 좌표, , NUMBER(10,8)")  // Y NUMBER(10,8)
        @JsonProperty("y_crdn")
        private Double yCrdn;

        @ApiModelProperty("설치 위치 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
        @JsonProperty("istl_lctn_nm")
        @Size(min=1, max=40)
        private String istlLctnNm;

        @ApiModelProperty("설치 위치 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("istl_lctn_addr")
        @Size(min=1, max=200)
        private String istlLctnAddr;

        @ApiModelProperty("CCTV 채널, Nullable = Y, NUMBER(2)")  // Y NUMBER(2)
        @JsonProperty("cctv_chnl")
        @PositiveOrZero
        private Integer cctvChnl;

        @ApiModelProperty("삭제 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
        @JsonProperty("del_yn")
        @Size(min=1, max=1)
        @Pattern(regexp = "[YN]")
        private String delYn;

        @ApiModelProperty("최초 등록자 번호, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("frst_regr_nmbr")
        @Size(min=1, max=20)
        private String frstRegrNmbr;

        @ApiModelProperty("최초 등록 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
        @JsonProperty("frst_rgst_dt")
        @Size(min=1, max=14)
        private String frstRgstDt;

        @ApiModelProperty("최종 수정자 번호, Nullable = Y, VARCHAR(20)")  // Y VARCHAR(20)
        @JsonProperty("last_crpr_nmbr")
        @Size(min=1, max=20)
        private String lastCrprNmbr;

        @ApiModelProperty("최종 수정 일시, Nullable = Y, VARCHAR(14)")  // Y VARCHAR(14)
        @JsonProperty("last_crct_dt")
        @Size(min=1, max=14)
        private String lastCrctDt;

        @ApiModelProperty("링크ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
        @JsonProperty("link_id")
        @PositiveOrZero
        private Long linkId;

        @ApiModelProperty("노드ID, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
        @JsonProperty("node_id")
        @PositiveOrZero
        private Long nodeId;

        @ApiModelProperty("공단 CCTV ID, Nullable = Y, VARCHAR(10)")  // Y VARCHAR(10)
        @JsonProperty("cctv_id")
        @Size(min=1, max=10)
        private String cctvId;

        @ApiModelProperty("연계 포트, Nullable = Y, VARCHAR(5)")  // Y VARCHAR(5)
        @JsonProperty("rely_port")
        @Size(min=1, max=5)
        private String relyPort;

        @ApiModelProperty("스트리밍 RTSP 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("strm_rtsp_addr")
        @Size(min=1, max=200)
        private String strmRtspAddr;

        @ApiModelProperty("스트리밍 RTMP 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("strm_rtmp_addr")
        @Size(min=1, max=200)
        private String strmRtmpAddr;

        @ApiModelProperty("스트리밍 HTTP 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("strm_http_addr")
        @Size(min=1, max=200)
        private String strmHttpAddr;

        @ApiModelProperty("스트리밍 저장 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("strm_stor_addr")
        @Size(min=1, max=200)
        private String strmStorAddr;

        @ApiModelProperty("지역 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
        @JsonProperty("area_cd")
        @Size(min=1, max=7)
        private String areaCd;

        @ApiModelProperty("CCTV 유형(1:제노시스,2:프로브디지터,3:영국전자), Nullable = Y, VARCHAR(10)")  // Y VARCHAR(10)
        @JsonProperty("cctv_type")
        @Size(min=1, max=10)
        private String cctvType;

        @ApiModelProperty("CCTV 대체 영상, Nullable = Y, Image Data")  // Y BLOB
        @JsonProperty("cctv_sbst_imgn")
        private byte[] cctvSbstImgn;

        @ApiModelProperty("CCTV 대체 표출 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
        @JsonProperty("cctv_sbst_dspl_yn")
        @Size(min=1, max=1)
        @Pattern(regexp = "[YN]")
        private String cctvSbstDsplYn;

        @ApiModelProperty("CCTV 지역 구분, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
        @JsonProperty("cctv_area_dvsn")
        @Size(min=1, max=7)
        private String cctvAreaDvsn;

        @ApiModelProperty("내부 RTMP 주소, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(200)
        @JsonProperty("intr_rtmp_addr")
        @Size(min=1, max=200)
        private String intrRtmpAddr;

        @ApiModelProperty("운영자 제어 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
        @JsonProperty("syop_cntl_yn")
        @Size(min=1, max=1)
        @Pattern(regexp = "[YN]")
        private String syopCntlYn;

        @Builder
        public TbCctvCtlrUpdReq(Long cctv_mngm_nmbr, String cctv_ctlr_id, String cctv_ctlr_ip, String cctv_ctlr_port, String cctv_capt_ip, String cctv_capt_port, String cctv_fibr_ip, String cctv_encd_ip, String strm_svr_ip, String strm_svr_port, String strm_sesn_nm, Double x_crdn, Double y_crdn, String istl_lctn_nm, String istl_lctn_addr, Integer cctv_chnl, String del_yn, String frst_regr_nmbr, String frst_rgst_dt, String last_crpr_nmbr, String last_crct_dt, Long link_id, Long node_id, String cctv_id, String rely_port, String strm_rtsp_addr, String strm_rtmp_addr, String strm_http_addr, String strm_stor_addr, String area_cd, String cctv_type, byte[] cctv_sbst_imgn, String cctv_sbst_dspl_yn, String cctv_area_dvsn, String intr_rtmp_addr, String syop_cntl_yn) {
            this.cctvMngmNmbr = cctv_mngm_nmbr;
            this.cctvCtlrId = cctv_ctlr_id;
            this.cctvCtlrIp = cctv_ctlr_ip;
            this.cctvCtlrPort = cctv_ctlr_port;
            this.cctvCaptIp = cctv_capt_ip;
            this.cctvCaptPort = cctv_capt_port;
            this.cctvFibrIp = cctv_fibr_ip;
            this.cctvEncdIp = cctv_encd_ip;
            this.strmSvrIp = strm_svr_ip;
            this.strmSvrPort = strm_svr_port;
            this.strmSesnNm = strm_sesn_nm;
            this.xCrdn = x_crdn;
            this.yCrdn = y_crdn;
            this.istlLctnNm = istl_lctn_nm;
            this.istlLctnAddr = istl_lctn_addr;
            this.cctvChnl = cctv_chnl;
            this.delYn = del_yn;
            this.frstRegrNmbr = frst_regr_nmbr;
            this.frstRgstDt = frst_rgst_dt;
            this.lastCrprNmbr = last_crpr_nmbr;
            this.lastCrctDt = last_crct_dt;
            this.linkId = link_id;
            this.nodeId = node_id;
            this.cctvId = cctv_id;
            this.relyPort = rely_port;
            this.strmRtspAddr = strm_rtsp_addr;
            this.strmRtmpAddr = strm_rtmp_addr;
            this.strmHttpAddr = strm_http_addr;
            this.strmStorAddr = strm_stor_addr;
            this.areaCd = area_cd;
            this.cctvType = cctv_type;
            this.cctvSbstImgn = cctv_sbst_imgn;
            this.cctvSbstDsplYn = cctv_sbst_dspl_yn;
            this.cctvAreaDvsn = cctv_area_dvsn;
            this.intrRtmpAddr = intr_rtmp_addr;
            this.syopCntlYn = syop_cntl_yn;
        }

        public TbCctvCtlr toEntity() {
            return TbCctvCtlr.builder()
                    .cctvMngmNmbr(this.cctvMngmNmbr)
                    .cctvCtlrId(this.cctvCtlrId)
                    .cctvCtlrIp(this.cctvCtlrIp)
                    .cctvCtlrPort(this.cctvCtlrPort)
                    .cctvCaptIp(this.cctvCaptIp)
                    .cctvCaptPort(this.cctvCaptPort)
                    .cctvFibrIp(this.cctvFibrIp)
                    .cctvEncdIp(this.cctvEncdIp)
                    .strmSvrIp(this.strmSvrIp)
                    .strmSvrPort(this.strmSvrPort)
                    .strmSesnNm(this.strmSesnNm)
                    .xCrdn(this.xCrdn)
                    .yCrdn(this.yCrdn)
                    .istlLctnNm(this.istlLctnNm)
                    .istlLctnAddr(this.istlLctnAddr)
                    .cctvChnl(this.cctvChnl)
                    .delYn(this.delYn)
                    .frstRegrNmbr(this.frstRegrNmbr)
                    .frstRgstDt(this.frstRgstDt)
                    .lastCrprNmbr(this.lastCrprNmbr)
                    .lastCrctDt(this.lastCrctDt)
                    .linkId(this.linkId)
                    .nodeId(this.nodeId)
                    .cctvId(this.cctvId)
                    .relyPort(this.relyPort)
                    .strmRtspAddr(this.strmRtspAddr)
                    .strmRtmpAddr(this.strmRtmpAddr)
                    .strmHttpAddr(this.strmHttpAddr)
                    .strmStorAddr(this.strmStorAddr)
                    .areaCd(this.areaCd)
                    .cctvType(this.cctvType)
                    .cctvSbstImgn(this.cctvSbstImgn)
                    .cctvSbstDsplYn(this.cctvSbstDsplYn)
                    .cctvAreaDvsn(this.cctvAreaDvsn)
                    .intrRtmpAddr(this.intrRtmpAddr)
                    .syopCntlYn(this.syopCntlYn)
                    .build();
        }

    }

}
