package com.its.vds.xnettcp.vds.process.response.impl;

import com.its.vds.domain.NET;
import com.its.vds.dto.TbVdsCtlrDto;
import com.its.vds.xnettcp.vds.process.response.VdsResponse;
import com.its.vds.xnettcp.vds.protocol.VdsFramePacket;
import com.its.vds.xnettcp.vds.protocol.enums.eVdsOpCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

@Slf4j
@RequiredArgsConstructor
public class VdsResDataVolume implements VdsResponse {

    private final TbVdsCtlrDto vdsObj;
    private final VdsFramePacket resFramePacket;

    private int   powerCtrlMode;  // 전원제어 모드                1 Byte  0x00 : 꺼짐, 0x01 : 켜짐,
    private int   fanRunMode;     // Fan 동작모드                 1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
    private int   fanRunTemp;     // Fan 의 동작개시온도          1 Byte  온도( 0x00 ~0x03f )
    private int   heaterRunMode;  // Heater 의 동작모드           1 Byte  0x00 : 꺼짐, 0x01 : 켜짐, 0x02 : 자동, 0x09: Unknown
    private int   heaterRunTemp;  // Heater 의 동작개시온도       1 Byte  온도(0x00 ~ 0x3f )
    private int   brightMode;     // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
    private int   brightCurr;     // 화면의 밝기 - 현재 휘도값, 0～100
    private int   brightWeek;     // 화면의 밝기 - 주간 휘도값, 0～100
    private int   brightNght;     // 화면의 밝기 - 야간 휘도값, 0～100
    private int   blinkTime;      // 깜빡이는 시간주기            1 Byte  문자 비트맵의 깜빡이는 시간주기 0x00 ~ 0x1e( 0.1 ~3.0 )
    private short scnTurnTime;    // 디폴트 시나리오로 전환시간   2 Byte  디폴트 시나리오로 전환될 때까지 기다리는 시간, 단위 : 초
    private int   modlErrRate;    // 장애 모듈비율(%)             1 Byte  에러난 픽셀의 백분율 (0～100: 초기값:10%)

    //현재 로컬 제어기의 시간
    private int   year;           // 년       1 Byte  0x00 ~ 0x32
    private int   mon;            // 월       1 Byte  0x01 ~ 0x0c
    private int   day;            // 일       1 Byte  0x01 ~ 0x1f
    private int   hour;           // 시       1 Byte  0x00 ~ 0x17
    private int   min;            // 분       1 Byte  0x00 ~ 0x3b
    private int   sec;            // 초       1 Byte  0x00 ~ 0x3b

    @Override
    public boolean process() {

        byte[] body = this.resFramePacket.getBody();
        log.info("VdsResDataVolume.process: VDS {}, body length: {}.", this.vdsObj.getVdsCtlrNmbr(), body != null ? body.length : 0);
        if (body == null || body.length < 17) {
            log.error("VdsResDataVolume.process: VDS {}, body length error: {}.", this.vdsObj.getVdsCtlrNmbr(), body != null ? body.length : 0);
            return false;
        }

        // Byte.toUnsignedInt(
        ByteBuffer byteBuffer = ByteBuffer.wrap(body);
        byteBuffer.order(ByteOrder.BIG_ENDIAN);
        this.powerCtrlMode = byteBuffer.get() & 0xFF;
        this.fanRunMode = byteBuffer.get() & 0xFF;
        this.fanRunTemp = byteBuffer.get() & 0xFF;
        this.heaterRunMode = byteBuffer.get() & 0xFF;
        this.heaterRunTemp = byteBuffer.get() & 0xFF;
        this.brightMode = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 휘도 모드, 0x00:주간, 0x01:야간, 0x02:Auto, 0x03:수동
        this.brightCurr = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 현재 휘도값, 0～100
        if (body.length > 17) {
            this.brightWeek = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 주간 휘도값, 0～100
            this.brightNght = byteBuffer.get() & 0xFF;  // 화면의 밝기 - 야간 휘도값, 0～100
        }
        else {
            this.brightWeek = 0;
            this.brightNght = 0;
        }
        this.blinkTime = byteBuffer.get() & 0xFF;
        this.scnTurnTime = (short) (byteBuffer.getShort() & 0xFFFF);
        this.modlErrRate = byteBuffer.get() & 0xFF;
        this.year = byteBuffer.get() & 0xFF;
        this.mon = byteBuffer.get() & 0xFF;
        this.day = byteBuffer.get() & 0xFF;
        this.hour = byteBuffer.get() & 0xFF;
        this.min = byteBuffer.get() & 0xFF;
        this.sec = byteBuffer.get() & 0xFF;

        if (this.vdsObj.getDebug().isDebug()) {
            log.info("{}", toString());
        }

//        this.vdsObj.updateParameter(powerCtrlMode, fanRunMode, fanRunTemp, heaterRunMode, heaterRunTemp,
//                                    brightMode, brightCurr, brightWeek, brightNght, blinkTime, scnTurnTime, modlErrRate);

        /**
         * powerCtrlMode : 전광판 전원 On/Off 상태 정보임.
         */
//        this.vdsObj.getModule().setCurOnOff(this.powerCtrlMode);

        nextCommand();
        return true;
    }

    public void nextCommand() {
        if (this.vdsObj.getNetState() == NET.LOGIN_REQ) {
            // 최초 접속후, 상태정보->파워모듈상태->표출모듈상태->파라미터정보 조회 완료후
            // 네트워크 로그인 상태로 설정하고 스케쥴을 다운로드 하도록 한다.
//            if (this.vdsObj.getReqDnldSymbMap().size() > 0) {
//                this.vdsObj.downloadSymbLib();
//            }
//            else {
//                this.vdsObj.setNetState(NET.LOGINED);
//                this.vdsObj.downloadForm();
//            }
        }
    }

    public String toString() {
        StringBuilder data = new StringBuilder();
        data.append(String.format("RESPONSE-%s. VDS %d", eVdsOpCode.OP_VDS_DATA_IMAGE, this.vdsObj.getVdsCtlrNmbr()));
        data.append(System.getProperty("line.separator")).append(String.format(" PANL_PWER_MODE(%02X)", this.powerCtrlMode));
        data.append(System.getProperty("line.separator")).append(String.format("       FAN_MODE(%02X)", this.fanRunMode));
        data.append(System.getProperty("line.separator")).append(String.format("   FAN_RUN_TMPR(%d)", this.fanRunTemp));
        data.append(System.getProperty("line.separator")).append(String.format("      HETR_MODE(%02X)", this.heaterRunMode));
        data.append(System.getProperty("line.separator")).append(String.format("  HETR_RUN_TMPR(%d)", this.heaterRunTemp));
        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_MODE(%02X)", this.brightMode));
        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_CURR(%d)", this.brightCurr));
        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_WEEK(%d)", this.brightWeek));
        data.append(System.getProperty("line.separator")).append(String.format("      BRGH_NGHT(%d)", this.brightNght));
        data.append(System.getProperty("line.separator")).append(String.format("     BLINK_TIME(%d)", this.blinkTime));
        data.append(System.getProperty("line.separator")).append(String.format("  SCN_TURN_TIME(%d)", this.scnTurnTime));
        data.append(System.getProperty("line.separator")).append(String.format("     LOCAL_TIME(%04d%02d%02d%02d%02d%02d)", this.year+2000, this.mon, this.day, this.hour, this.min, this.sec));
        return data.toString();
    }

}
