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

import com.fasterxml.jackson.annotation.JsonProperty;
import com.its.op.entity.its.vms.TbVmsCtlr;
import com.its.op.entity.its.vms.TbVmsDsplPrst;
import com.its.utils.ItsUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * VMS 표출 현재 DTO Class
 */
@Data
@Builder
@ApiModel("TbVmsDsplPrstDto(VMS 표출 현재)")
public class TbVmsDsplPrstDto implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
    @JsonProperty("vms_ctlr_nmbr")
    private Long vmsCtlrNmbr;

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

    @ApiModelProperty("VMS 명, Nullable = Y, VARCHAR(40)")  // Y VARCHAR(40)
    @JsonProperty("vms_nm")
    @Size(min=1, max=40)
    private String vmsNm;

    @ApiModelProperty("VMS 너비")  // Y NUMBER(4)
    @JsonProperty("vms_wdth")
    private Integer vmsWdth;

    @ApiModelProperty("VMS 높이")  // Y NUMBER(4)
    @JsonProperty("vms_hght")
    private Integer vmsHght;

    @ApiModelProperty("가로갯수")
    @JsonProperty("rows")
    private Integer rows;

    @ApiModelProperty("세로갯수")
    @JsonProperty("cols")
    private Integer cols;

    @ApiModelProperty("모듈 가로갯수")
    @JsonProperty("modl_rows")
    private Integer modlRows;

    @ApiModelProperty("모듈 세로갯수")
    @JsonProperty("modl_cols")
    private Integer modlCols;

    @ApiModelProperty("전원 가로갯수")
    @JsonProperty("powr_rows")
    private Integer powrRows;

    @ApiModelProperty("전원 세로갯수")
    @JsonProperty("powr_cols")
    private Integer powrCols;

    @ApiModelProperty("운영모드")
    @JsonProperty("oper_mode")
    private String operMode;

    @ApiModelProperty("운영모드설명")
    @JsonProperty("oper_mode_desc")
    private String operModeDesc;

    @ApiModelProperty("표출 일시")  // Y VARCHAR(14)
    @JsonProperty("dspl_dt")
    private String dsplDt;

    @ApiModelProperty("서비스 여부(Y:성공,N:실패)")
    @JsonProperty("svc_yn")
    private String svcYn;

    // 상태정보 설명
    @ApiModelProperty("통신 상태 코드 설명")
    @JsonProperty("cmnc_stts_desc")
    private String cmncSttsDesc;

    @ApiModelProperty("전원 상태 코드 설명")
    @JsonProperty("pwer_stts_desc")
    private String pwerSttsDesc;

    @ApiModelProperty("모듈개별상태 설명")
    @JsonProperty("modl_stts_desc")
    private String modlSttsDesc;

    @ApiModelProperty("함체문 열림 상태 코드 설명")
    @JsonProperty("cbox_door_stts_desc")
    private String cboxDoorSttsDesc;

    @ApiModelProperty("팬 상태 코드 설명")
    @JsonProperty("fan_stts_desc")    // FAN_STTS_CD
    private String fanSttsDesc;

    @ApiModelProperty("히터 상태 코드 설명")
    @JsonProperty("hetr_stts_desc")    // HETR_STTS_CD
    private String hetrSttsDesc;

    @ApiModelProperty("상태정보 결측 여부")
    @JsonProperty("miss_stts_yn")
    private String missSttsYn;

    @ApiModelProperty("함체 온도")  // Y NUMBER(3)
    @JsonProperty("cbox_tmpr")
    private Integer cboxTmpr;

    @ApiModelProperty("휘도값")  // Y NUMBER(3)
    @JsonProperty("brgh_val")
    private Integer brghVal;

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

    @ApiModelProperty("VMS 용도 유형 코드 설명")
    @JsonProperty("vms_usag_type_desc")
    private String vmsUsagTypeDesc;

    @ApiModelProperty("VMS 유형 코드 설명")
    @JsonProperty("vms_type_desc")
    private String vmsTypeDesc;

    // 표출메시지 목록
    @ApiModelProperty("VMS 표출메시지 목록")
    @JsonProperty("msgs")
    private List<VmsMsgDsplInfo> msgs;

    public void addMsg(TbVmsDsplPrst msg) {
        if (this.msgs == null) {
            this.msgs = new ArrayList<>();
        }
        this.msgs.add(VmsMsgDsplInfo.builder()
                .phase(msg.getPhase())
                .vmsSchType(msg.getVmsSchType())
                .vmsSchFormType(msg.getVmsSchFormType())
                .vmsFormId(msg.getVmsFormId())
                .dnldYn(msg.getDnldYn())
                .dsplHh(msg.getDsplHh())
                .vmsDsplMsgImag(ItsUtils.convertBmpToPng(msg.getVmsDsplMsgImag()))
                .imagFmt("png")
                .build());
    }

    public void setStts(TbVmsCtlr vms) {
        if (vms != null) {
            TbVmsCtlrSttsDto stts = vms.toSttsDto();

            this.cmncSttsDesc = stts.getCmncSttsDesc();
            this.pwerSttsDesc = stts.getPwerSttsDesc();
            this.modlSttsDesc = stts.getModlSttsDesc();
            this.cboxDoorSttsDesc = stts.getCboxDoorSttsDesc();
            this.fanSttsDesc = stts.getFanSttsDesc();
            this.hetrSttsDesc = stts.getHetrSttsDesc();
            this.missSttsYn = stts.getMissSttsYn();
            this.cboxTmpr = stts.getCboxTmpr();
            this.brghVal = stts.getBrghVal();
        }
    }

    @ApiModel("VmsMsgDsplInfo(VMS 표출메시지정보)")
    @Getter
    @Setter
    @ToString
    @Builder
    //@NoArgsConstructor//(access = AccessLevel.PROTECTED)
    public static class VmsMsgDsplInfo {
        @ApiModelProperty("PHASE")  // N NUMBER(2)
        @JsonProperty("phase")
        private Integer phase;

        @ApiModelProperty("VMS 스케줄 유형(A:자동,F:고정,B:기본)")  // N VARCHAR2(5)
        @JsonProperty("vms_sch_type")
        private String vmsSchType;

        @ApiModelProperty("VMS 폼 스케쥴 유형(0:교통,1:돌발,2:공사행사,3:홍보,4:우회,5:정체,6:안전,7:동영상,8:스트리밍영상)")  // Y NUMBER(3)
        @JsonProperty("vms_sch_form_type")
        private Integer vmsSchFormType;

        @ApiModelProperty("VMS FORM ID")  // Y NUMBER(5)
        @JsonProperty("vms_form_id")
        private Integer vmsFormId;

        @ApiModelProperty("제어기다운로드 여부(Y:성공,N:실패)")  // Y CHAR(1)
        @JsonProperty("dnld_yn")
        private String dnldYn;

        @ApiModelProperty("표출 시간")  // Y NUMBER(3)
        @JsonProperty("dspl_hh")
        private Integer dsplHh;

        @ApiModelProperty("VMS 표출 메시지 이미지")  // Y BLOB
        @JsonProperty("vms_dspl_msg_imag")
        private byte[] vmsDsplMsgImag;

        @ApiModelProperty("이미지 형식(bmp, png)")
        @JsonProperty("imag_fmt")
        private String imagFmt;
    }

}
