package com.its.op.dto.its.vms;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.its.op.entity.its.vms.TbVmsSymbLib;
import com.its.utils.ItsUtils;
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;

/**
 * VMS 심벌 라이브러리 DTO Class
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("TbVmsSymbLibDto(VMS 심벌 라이브러리)")
public class TbVmsSymbLibDto implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("심벌라이브러리 번호")  // N NUMBER(4)
    @JsonProperty("symb_lib_nmbr")
    private Integer symbLibNmbr;

    @ApiModelProperty("등록 일시")  // Y VARCHAR2(14)
    @JsonProperty("rgst_dt")
    private String rgstDt;

    @ApiModelProperty("RED 데이터")  // Y BLOB
    @JsonProperty("red_data")
    private byte[] redData;

    @ApiModelProperty("GREEN 데이터")  // Y BLOB
    @JsonProperty("green_data")
    private byte[] greenData;

    @ApiModelProperty("심벌 설명")  // Y VARCHAR2(200)
    @JsonProperty("symb_expl")
    private String symbExpl;

    @ApiModelProperty("이미지 데이터(동영상인경우 썸네일)")  // Y BLOB
    @JsonProperty("imag_data")
    private byte[] imagData;

    @ApiModelProperty("심벌 파일 명")  // Y VARCHAR2(60)
    @JsonProperty("symb_file_nm")
    private String symbFileNm;

    @ApiModelProperty("심벌 유형(SBT0:일반심벌이미지,SBT1:소통정보배경,SBT2:소통정보이미지,SBT3:동영상,SBT4:대기환경등급)")  // Y VARCHAR2(5)
    @JsonProperty("symb_type")
    private String symbType;

    @ApiModelProperty("동영상인 경우 동영상 데이터")  // Y BLOB
    @JsonProperty("avi_data")
    private byte[] aviData;

    @ApiModelProperty("이미지 사이즈")  // Y NUMBER(10)
    @JsonProperty("imag_size")
    private Long imagSize;

    @ApiModelProperty("동영상 플레이 시간")  // Y NUMBER(10)
    @JsonProperty("play_tm")
    private Long playTm;

    @ApiModelProperty("삭제 여부(제공정보이력조회에 사용을 위해 실데이터를 삭제하지 않는다)")  // Y CHAR(1)
    @JsonProperty("del_yn")
    private String delYn;

    @ApiModelProperty("갱신 일시")  // N VARCHAR2(14)
    @JsonProperty("updt_dt")
    private String updtDt;

    @JsonIgnore
    //@ApiModelProperty("VMS 유형 코드")  // Y VARCHAR(7)
    //@JsonProperty("vms_type_cd")
    private String vmsTypeCd;

    // Code Description Field
    @ApiModelProperty("삭제 여부(제공정보이력조회에 사용을 위해 실데이터를 삭제하지 않는다) 설명")
    @JsonProperty("del_desc")    // DEL_YN
    private String delDesc;

    @ApiModel("TbVmsSymbLibUpdReq(VMS 심벌 라이브러리 정보변경)")
    @Getter
    @Setter
    @ToString
    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
    public static class TbVmsSymbLibUpdReq {

        @ApiModelProperty("심벌라이브러리 번호, Nullable = N, NUMBER(4)")  // N NUMBER(4)
        @JsonProperty("symb_lib_nmbr")
        @PositiveOrZero
        private Integer symbLibNmbr;

        @ApiModelProperty("등록 일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
        @JsonProperty("rgst_dt")
        @Size(min=1, max=14)
        private String rgstDt;

        @ApiModelProperty("RED 데이터, Nullable = Y, Image Data")  // Y BLOB
        @JsonProperty("red_data")
        private byte[] redData;

        @ApiModelProperty("GREEN 데이터, Nullable = Y, Image Data")  // Y BLOB
        @JsonProperty("green_data")
        private byte[] greenData;

        @ApiModelProperty("심벌 설명, Nullable = Y, VARCHAR2(200)")  // Y VARCHAR2(200)
        @JsonProperty("symb_expl")
        @Size(min=1, max=200)
        private String symbExpl;

        @ApiModelProperty("이미지 데이터(동영상인경우 썸네일), Nullable = Y, Image Data")  // Y BLOB
        @JsonProperty("imag_data")
        private byte[] imagData;

        @ApiModelProperty("심벌 파일 명, Nullable = Y, VARCHAR2(60)")  // Y VARCHAR2(60)
        @JsonProperty("symb_file_nm")
        @Size(max=60)
        private String symbFileNm;

        @ApiModelProperty("심벌 유형(SBT0:일반심벌이미지,SBT1:소통정보배경,SBT2:소통정보이미지,SBT3:동영상,SBT4:대기환경등급), Nullable = Y, VARCHAR2(5)")  // Y VARCHAR2(5)
        @JsonProperty("symb_type")
        @Size(min=1, max=5)
        private String symbType;

        @ApiModelProperty("동영상인 경우 동영상 데이터, Nullable = Y, Image Data")  // Y BLOB
        @JsonProperty("avi_data")
        private byte[] aviData;

        @ApiModelProperty("이미지 사이즈, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
        @JsonProperty("imag_size")
        @PositiveOrZero
        private Long imagSize;

        @ApiModelProperty("동영상 플레이 시간, Nullable = Y, NUMBER(10)")  // Y NUMBER(10)
        @JsonProperty("play_tm")
        @PositiveOrZero
        private Long playTm;

        @ApiModelProperty("삭제 여부(제공정보이력조회에 사용을 위해 실데이터를 삭제하지 않는다), Nullable = Y, CHAR(1)")  // Y CHAR(1)
        @JsonProperty("del_yn")
        @Size(min=1, max=1)
        @Pattern(regexp = "[YN]")
        private String delYn;

        @ApiModelProperty("갱신 일시, Nullable = N, VARCHAR2(14)")  // N VARCHAR2(14)
        @JsonProperty("updt_dt")
        @Size(max=14)
        private String updtDt;

        @Builder
        public TbVmsSymbLibUpdReq(Integer symb_lib_nmbr, String rgst_dt, byte[] red_data, byte[] green_data, String symb_expl, byte[] imag_data, String symb_file_nm, String symb_type, byte[] avi_data, Long imag_size, Long play_tm, String del_yn, String updt_dt) {
            this.symbLibNmbr = symb_lib_nmbr;
            this.rgstDt = rgst_dt;
            this.symbExpl = symb_expl;
            this.imagData = imag_data;
            this.symbFileNm = symb_file_nm;
            this.symbType = symb_type;
            this.imagSize = imag_size;
            this.playTm = play_tm;
            this.delYn = del_yn;
            this.updtDt = updt_dt;
            this.symbExpl = symb_expl;
            if (this.delYn == null) {
                this.delYn = "N";
            }
            this.updtDt = ItsUtils.getSysTime();

            //this.redData = red_data;
            // FOR KISA Secure Coding pass
            this.redData = null;
            if (red_data != null && red_data.length > 0) {
                this.redData = new byte[red_data.length];
                System.arraycopy(red_data, 0, this.redData, 0, red_data.length);
            }

            //this.greenData = green_data;
            // FOR KISA Secure Coding pass
            this.greenData = null;
            if (green_data != null && green_data.length > 0) {
                this.greenData = new byte[green_data.length];
                System.arraycopy(green_data, 0, this.greenData, 0, green_data.length);
            }

            //this.aviData = avi_data;
            // FOR KISA Secure Coding pass
            this.aviData = null;
            if (avi_data != null && avi_data.length > 0) {
                this.aviData = new byte[avi_data.length];
                System.arraycopy(avi_data, 0, this.aviData, 0, avi_data.length);
            }

            //this.imagData = imag_data;
            // FOR KISA Secure Coding pass
            this.imagData = null;
            if (imag_data != null && imag_data.length > 0) {
                this.imagData = new byte[imag_data.length];
                System.arraycopy(imag_data, 0, this.imagData, 0, imag_data.length);
            }
        }

        public TbVmsSymbLib toEntity() {
            return TbVmsSymbLib.builder()
                    .symbLibNmbr(this.symbLibNmbr)
                    .rgstDt(this.rgstDt)
                    .redData(this.redData)
                    .greenData(this.greenData)
                    .symbExpl(this.symbExpl)
                    .imagData(this.imagData)
                    .symbFileNm(this.symbFileNm)
                    .symbType(this.symbType)
                    .aviData(this.aviData)
                    .imagSize(this.imagSize)
                    .playTm(this.playTm == null ? 0 : this.playTm)
                    .delYn(this.delYn == null ? "N" : this.delYn)
                    .updtDt(this.updtDt == null ? ItsUtils.getSysTime() : this.updtDt)
                    .build();
        }

    }

}
