package com.its.api.its.model.entity.vms;

import com.its.api.its.global.CodeManager;
import com.its.api.its.model.dto.vms.TbVmsSttsHsDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import javax.persistence.*;
import java.io.Serializable;

/**
 * VMS 상태 이력 Entity Class
 */
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@AllArgsConstructor
@ApiModel("VMS 상태 이력")
@Entity
@Table(name = "TB_VMS_STTS_HS")
@IdClass(TbVmsSttsHsKey.class)
public class TbVmsSttsHs implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("VMS 제어기 번호")  // N NUMBER(10)
    @Id
    @Column(name = "VMS_CTLR_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
    private Long vmsCtlrNmbr;

    @ApiModelProperty("등록 일시")  // N VARCHAR(14)
    @Id
    @Column(name = "RGST_DT", nullable = false, length = 14)
    private String rgstDt;

    @ApiModelProperty("연결 상태 코드")  // Y VARCHAR(7)
    @Column(name = "CONN_STTS_CD", length = 7)
    private String connSttsCd;

    @ApiModelProperty("전원 상태 코드")  // Y VARCHAR(7)
    @Column(name = "PWER_STTS_CD", length = 7)
    private String pwerSttsCd;

    @ApiModelProperty("팬 상태 코드")  // Y VARCHAR(7)
    @Column(name = "FAN_STTS_CD", length = 7)
    private String fanSttsCd;

    @ApiModelProperty("히터 상태 코드")  // Y VARCHAR(7)
    @Column(name = "HETR_STTS_CD", length = 7)
    private String hetrSttsCd;

    @ApiModelProperty("함체문 열림 상태 코드")  // Y VARCHAR(7)
    @Column(name = "CBOXDOOR_OPEN_STTS_CD", length = 7)
    private String cboxdoorOpenSttsCd;

    @ApiModelProperty("함체팬 상태 코드")  // Y VARCHAR(7)
    @Column(name = "CBOXFAN_STTS_CD", length = 7)
    private String cboxfanSttsCd;

    @ApiModelProperty("함체히터 상태 코드")  // Y VARCHAR(7)
    @Column(name = "CBOXHETR_STTS_CD", length = 7)
    private String cboxhetrSttsCd;

    @ApiModelProperty("함체 온도")  // Y NUMBER(3)
    @Column(name = "CBOX_TMPR", columnDefinition = "NUMBER", length = 3)
    private Integer cboxTmpr;

    @ApiModelProperty("함체 습도")  // Y NUMBER(3)
    @Column(name = "CBOX_HMDT", columnDefinition = "NUMBER", length = 3)
    private Integer cboxHmdt;

    @ApiModelProperty("VMS 온도")  // Y NUMBER(3)
    @Column(name = "VMS_TMPR", columnDefinition = "NUMBER", length = 3)
    private Integer vmsTmpr;

    @ApiModelProperty("모듈개별상태(가로->세로순서0:정상,1:오류)")  // Y VARCHAR(200)
    @Column(name = "MODL_STTS", length = 200)
    private String modlStts;

    @ApiModelProperty("모듈전원개별상태(0:켜짐,1:꺼짐)")  // Y VARCHAR(10)
    @Column(name = "PWER_STTS", length = 10)
    private String pwerStts;

    @OneToOne
    @JoinColumn(insertable=false, updatable=false, name="VMS_CTLR_NMBR", referencedColumnName = "VMS_CTLR_NMBR")
    @NotFound(action = NotFoundAction.IGNORE)
    private TbVmsCtlr vms = new TbVmsCtlr();

    public TbVmsSttsHsDto toDto() {
        TbVmsSttsHsDto dto = TbVmsSttsHsDto.builder()
                .vmsCtlrNmbr(this.vmsCtlrNmbr)
                .crtnDt(this.rgstDt)
                .cmncSttsCd(this.connSttsCd)
                .pwerSttsCd(this.pwerSttsCd)
                .fanSttsCd(this.fanSttsCd)
                .hetrSttsCd(this.hetrSttsCd)
                .cboxDoorSttsCd(this.cboxdoorOpenSttsCd)
                .modlSttsCd(this.cboxfanSttsCd)
                .cboxTmpr(this.cboxTmpr)
                .modlStts(this.modlStts)
                .pwerStts(this.pwerStts)
                .build();

        dto.setCmncSttsDesc(CodeManager.getCodeDescShort(CodeManager.CMNC_STTS_CD, dto.getCmncSttsCd()));       // 통신상태
        if (CodeManager.CMNC_STTS_NORMAL.equals(dto.getCmncSttsCd())) {
            dto.setModlSttsDesc(CodeManager.getCodeDescShort(CodeManager.MODL_STTS_CD, dto.getModlSttsCd()));           // 모듈상태
            dto.setPwerSttsDesc(CodeManager.getCodeDescShort(CodeManager.PWER_STTS_CD, dto.getPwerSttsCd()));           // 전원상태
            dto.setCboxDoorSttsDesc(CodeManager.getCodeDescShort(CodeManager.DOOR_STTS_CD, dto.getCboxDoorSttsCd()));   // 도어
            dto.setFanSttsDesc(CodeManager.getCodeDescShort(CodeManager.FAN_STTS_CD, dto.getFanSttsCd()));              // 팬상태
            dto.setHetrSttsDesc(CodeManager.getCodeDescShort(CodeManager.HETR_STTS_CD, dto.getFanSttsCd()));            // 히터상태
        }
        else {
            dto.setModlSttsDesc(CodeManager.STTS_UNKNOWN);       // 모듈상태
            dto.setPwerSttsDesc(CodeManager.STTS_UNKNOWN);       // 전원상태
            dto.setCboxDoorSttsDesc(CodeManager.STTS_UNKNOWN);   // 도어
            dto.setFanSttsDesc(CodeManager.STTS_UNKNOWN);        // 팬상태
            dto.setHetrSttsDesc(CodeManager.STTS_UNKNOWN);       // 히터상태
            dto.setCboxTmpr(255);
        }

        if (this.vms != null) {
            dto.setVmsCtlrId(this.vms.getVmsCtlrId());
            dto.setVmsNm(this.vms.getVmsNm());
        }
        else {
            dto.setVmsCtlrId("-");
            dto.setVmsNm("?");
        }

        return dto;
    }

}
