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

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
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;
import java.util.List;

/**
 * VMS 심벌 라이브러리 DTO Class
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("TbVmsSymbLibIfscVMP1Dto(VMS 심벌 라이브러리 소통정보 배경 이미지 관계)")
public class TbVmsSymbLibIfscSbt1Dto implements Serializable {
    private static final long serialVersionUID = 1L;

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

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

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

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

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

    @ApiModelProperty("이미지 데이터")  // Y BLOB
    @JsonProperty("imag_data")
    private byte[] imagData;

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

    @JsonIgnore
    //@ApiModelProperty("심벌 이미지 유형")  // Y VARCHAR(7)
    //@JsonProperty("symb_imag_type")
    private String symbImagType;

    @JsonIgnore
    //@ApiModelProperty("심벌 파일 명")  // Y VARCHAR(40)
    //@JsonProperty("symb_file_nm")
    private String symbFileNm;

    // Code Description Field
    //@JsonIgnore
    //@ApiModelProperty("VMS 유형 코드 설명")
    //@JsonProperty("vms_type_desc")    // VMS_TYPE_CD
    //private String vmsTypeDesc;

    // 소통정보 이미지 셀정보(여러개 존재)
    List<TbVmsSymbIfscDto> cells;

    public static TbVmsSymbLibIfscSbt1Dto toDto(TbVmsSymbLibDto lib, List<TbVmsSymbIfscDto> cells) {
        TbVmsSymbLibIfscSbt1Dto dto = TbVmsSymbLibIfscSbt1Dto.builder()
                .symbLibNmbr(lib.getSymbLibNmbr())
                .rgstDt(lib.getRgstDt())
                .redData(lib.getRedData())
                .greenData(lib.getGreenData())
                .symbExpl(lib.getSymbExpl())
                .imagData(lib.getImagData())
                .vmsTypeCd(lib.getVmsTypeCd())
                .symbImagType(lib.getSymbType())
                .symbFileNm(lib.getSymbFileNm())
                .cells(cells)
                .build();

        return dto;
    }

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

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

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

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

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

        @ApiModelProperty("심벌 설명, Nullable = Y, VARCHAR(200)")  // Y VARCHAR(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, NUMBER(10)")  // Y NUMBER(10)
        @JsonProperty("imag_size")
        @PositiveOrZero
        private Long imagSize;

        @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;

        @JsonIgnore
        //@ApiModelProperty("VMS 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
        //@JsonProperty("vms_type_cd")
        //@Size(min=1, max=7)
        private String vmsTypeCd;

        @JsonIgnore
        //@ApiModelProperty("심벌 이미지 유형, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
        //@JsonProperty("symb_imag_type")
        //@Size(min=1, max=7)
        private String symbImagType;

        @JsonIgnore
        //@ApiModelProperty("심벌 파일 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
        //@JsonProperty("symb_file_nm")
        //@Size(min=1, max=40)
        private String symbFileNm;

        // 소통정보 이미지 셀정보(여러개 존재)
        @ApiModelProperty("이미지 셀 설정 정보 목록")
        List<TbVmsSymbIfscDto> cells;

        @Builder
        public TbVmsSymbLibIfscVMP1UpdReq(Integer symb_lib_nmbr, String rgst_dt, byte[] red_data, byte[] green_data, String symb_expl, byte[] imag_data, String vms_type_cd, String symb_imag_type, String symb_file_nm, List<TbVmsSymbIfscDto> cells) {
            this.symbLibNmbr = symb_lib_nmbr;
            this.rgstDt = rgst_dt;

            //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.symbExpl = symb_expl;
            //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);
            }
            this.vmsTypeCd = vms_type_cd;
            this.symbImagType = symb_imag_type;
            this.symbFileNm = symb_file_nm;

            // FOR KISA Secure Coding pass
            //this.cells = cells;
            List<TbVmsSymbIfscDto> temp = cells;
            this.cells = temp;
        }

        public TbVmsSymbLibDto.TbVmsSymbLibUpdReq toLibReq() {
            return TbVmsSymbLibDto.TbVmsSymbLibUpdReq.builder()
                    .symb_lib_nmbr(this.symbLibNmbr)
                    .rgst_dt(this.rgstDt)
                    .red_data(this.redData)
                    .green_data(this.greenData)
                    .symb_expl(this.symbExpl)
                    .imag_data(this.imagData)
                    .imag_size(this.imagSize)
                    //.vmsTypeCd(this.vmsTypeCd)
                    .symb_type(this.symbImagType)
                    .symb_file_nm(this.symbFileNm)
                    .build();
        }

    }

}
