package com.its.vds.api.service;

import com.its.vds.dao.mapper.VdsCtlrMapper;
import com.its.vds.service.AppRepositoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@RequiredArgsConstructor
@Service
public class VdsControlService {

    private final VdsCtlrMapper mapper;
    private final AppRepositoryService repoService;

    /**
     * 잘못된 제어기 관리번호로 요청이 들어온 경우
     * @param command
     * @param userId
     * @param vdsCtlrNmbr
     * @return
     */
//    public VdsControlDto.VdsControlRes unknownControlNmbr(eVmsStatusControl command, String userId, Long vdsCtlrNmbr) {
//        String ctrlType = String.format("V%02X", command.getByteValue());
//        return saveControlResult(8, "알수 없는 제어기 관리번호 입니다.", userId, vdsCtlrNmbr, ctrlType, "Unknown Nmbr: " + vdsCtlrNmbr);
//    }

    /**
     * VDS 제어 유형별 유형 타입이 잘못된 경우
     * @param command
     * @param type
     * @param userId
     * @param vdsCtlrNmbr
     * @return
     */
//    public VdsControlDto.VdsControlRes unknownControlType(eVmsStatusControl command, int type, String userId, Long vdsCtlrNmbr) {
//        String ctrlType = String.format("V%02X", command.getByteValue());
//        return saveControlResult(7, "알수 없는 제어유형 입니다.", userId, vdsCtlrNmbr, ctrlType, "Unknown Type: " + type);
//    }

    /**
     * VDS 제어 이력 저장 및 결과 리튼
     * @param error
     * @param message
     * @param userId
     * @param vdsCtlrNmbr
     * @param ctrlType
     * @param ctrlVal
     * @return
     */
//    public VdsControlDto.VdsControlRes saveControlResult(int error, String message, String userId, Long vdsCtlrNmbr, String ctrlType, String ctrlVal) {
//        this.mapper.insertVdsCtrlHs(TbVdsCtrlHs.builder()
//                .ctrlDt(ItsUtils.getSysTime())
//                .vdsCtlrNmbr(vdsCtlrNmbr)
//                .ctrlType(ctrlType)
//                .ctrlVal(ctrlVal)
//                .ctrlResult(error)
//                .userId(userId)
//                .build());
//
//        return new VdsControlDto.VdsControlRes(error, message);
//    }

    /**
     * VDS 제어기 상태 제어
     * @param userId
     * @param controlType
     * @param controlData
     * @return
     */
//    public VdsControlDto.VdsControlRes statusControlReq(String userId, eVmsStatusControl controlType, VdsReqDataLength controlData) {
//        byte[] body = controlData.getBody();
//        String ctrlType = String.format("V%02X", body[0]);
//        String ctrlVal = "";
//        switch(controlType) {
//            case CONTROL_SIGNBOARD_POWER: //           (0x01, "0x00.전광판 전원제어"),
//                ctrlVal  = (body[1] == (byte)(eVmsReqBoardPower.vms_req_board_power_on.getValue() & 0xFF)) ? "Board Panel Power ON" : "Board Panel Power OFF";
//                break;
//            case CONTROL_RESET: //                     (0x02, "0x02.제어기 리셋트"),
//                ctrlVal  = "Controller Reset";
//                break;
//            case CONTROL_RETRY_COUNT: //               (0x03, "0x03.통신 재시도 횟수"),
//                ctrlVal  = String.format("Retry Count 0x%02X", body[1]);
//                break;
//            case CONTROL_SYSTEM_TIME: //               (0x04, "0x04.제어기 시간 설정"),
//                byte[] sysTimeArr = new byte[14];
//                System.arraycopy(body, 1, sysTimeArr, 0, 14);
//                ctrlVal  = "System Time " + SysUtils.byteArrayToString(sysTimeArr);
//                break;
//            case CONTROL_BLINK_CYCLE: //               (0x05, "0x05.점멸시간 주기"),
//                ctrlVal  = String.format("Blink Cycle 0x%02X", body[1]);
//                break;
//            case CONTROL_BRIGHT: //                    (0x06, "0x06.밝기 제어"),
//                ctrlVal  = String.format("Bright 0x%02X, 0x%02X", body[1], body[2]);
//                break;
//            case CONTROL_FAN: //                       (0x07, "0x07.Fan 제어"),
//                ctrlVal  = String.format("Fan Control 0x%02X, 0x%02X", body[1], body[2]);
//                break;
//            case CONTROL_HEATER: //                    (0x08, "0x08.Heater 제어"),
//                ctrlVal  = String.format("Heater Control 0x%02X, 0x%02X", body[1], body[2]);
//                break;
//            case CONTROL_SCREEN_COLOR: //              (0x09, "0x09.화면 배색 제어"),
//                ctrlVal  = String.format("Screen Color 0x%02X", body[1]);
//                break;
//            case CONTROL_MODULE_ERROR_RATIO: //        (0x0A, "0x0A.장애 모듈비율(%)"),
//                ctrlVal  = String.format("Module Error Ratio 0x%02X", body[1]);
//                break;
//            case CONTROL_DEFAULT_SCENARIO_RUN_TIME: // (0x0B, "0x0B.디폴트 시나리오 동작 시간")
//                ctrlVal  = String.format("Default Scenario Run Time 0x%02X", body[1]);
//                break;
//        }
//
//        TbVdsCtlrDto vdsObj = controlData.getVdsObj();
//        if (vdsObj.getNetState() == NET.CLOSED) {
//            return saveControlResult(1, "통신이 연결되어 있지 않습니다.", userId, vdsObj.getVdsCtlrNmbr(), ctrlType, ctrlVal);
//        }
//        else {
//            /**
//             * 제어기로 상태제어 명령을 요청
//             */
//            vdsObj.addRequestData(new TcpServerSendData(eVdsOpCode.OP_VDS_DATA_LENGTH, controlData));
//        }
//
//        return saveControlResult(0, "success: 명령을 정상적으로 전송하였습니다.", userId, vdsObj.getVdsCtlrNmbr(), ctrlType, ctrlVal);
//    }

    /**
     * VDS 제어기 리셋
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlReset(Long vdsCtlrNmbr, VdsControlDto.VdsControlResetReq req) {
//        log.warn("VmsControlService.controlReset: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_RESET;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlReset();
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 리셋
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlPanlOnOff(Long vdsCtlrNmbr, VdsControlDto.VdsControlPanlOnOfReq req) {
//        log.warn("VmsControlService.controlPanlOnOff: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_SIGNBOARD_POWER;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        byte onOff = req.getOnOff() == 0 ? eVmsReqBoardPower.vms_req_board_power_off.getByteValue() : eVmsReqBoardPower.vms_req_board_power_on.getByteValue();
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlSignboardPower(onOff);
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 시간동기
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlTimeSync(Long vdsCtlrNmbr, VdsControlDto.VdsControlTimeSyncReq req) {
//        log.warn("VmsControlService.controlTimeSync: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_SYSTEM_TIME;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlSystemTime();
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 밝기 제어
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlBright(Long vdsCtlrNmbr, VdsControlDto.VdsControlBrightReq req) {
//        log.warn("VmsControlService.controlBright: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_BRIGHT;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        eVmsReqBrightControl controlType = eVmsReqBrightControl.getValue(req.getType());
//        if (controlType == null) {
//            return unknownControlType(command, req.getType(), req.getUserId(), vdsCtlrNmbr);
//        }
//
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlBright(controlType.getByteValue(), (byte)(req.getValue() & 0xFF));
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 FAN 제어
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlFan(Long vdsCtlrNmbr, VdsControlDto.VdsControlFanReq req) {
//        log.warn("VmsControlService.controlFan: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_FAN;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        eVmsReqFanControl controlType = eVmsReqFanControl.getValue(req.getType());
//        if (controlType == null) {
//            return unknownControlType(command, req.getType(), req.getUserId(), vdsCtlrNmbr);
//        }
//
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlFan(controlType.getByteValue(), (byte)(req.getValue() & 0xFF));
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 HEATER 제어
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlHeater(Long vdsCtlrNmbr, VdsControlDto.VdsControlHeaterReq req) {
//        log.warn("VmsControlService.controlHeater: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_HEATER;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        eVmsReqHeaterControl controlType = eVmsReqHeaterControl.getValue(req.getType());
//        if (controlType == null) {
//            return unknownControlType(command, req.getType(), req.getUserId(), vdsCtlrNmbr);
//        }
//
//        VdsReqDataLength controlData = new VdsReqDataLength(vdsObj);
//        controlData.controlHeater(controlType.getByteValue(), (byte)(req.getValue() & 0xFF));
//        return statusControlReq(req.getUserId(), command, controlData);
//    }

    /**
     * VDS 제어기 동작온도 설정
     * @param vdsCtlrNmbr
     * @param req
     * @return
     */
//    public VdsControlDto.VdsControlRes controlRunTemp(Long vdsCtlrNmbr, VdsControlDto.VdsControlRunTempReq req) {
//        log.warn("VmsControlService.controlRunTemp: VDS {}, {}.", vdsCtlrNmbr, req);
//        eVmsStatusControl command = eVmsStatusControl.CONTROL_FAN;
//        TbVdsCtlrDto vdsObj = this.repoService.getCtlrMap(vdsCtlrNmbr);
//        if (vdsObj == null) {
//            return unknownControlNmbr(command, req.getUserId(), vdsCtlrNmbr);
//        }
//
//        // TODO: VDS 파라미터 제어 명령이 없어서 상태제어 명령으로 처리하고 있음.
//        // 제어기 업체와 협의하여 상태제어 명령으로 처리하는 것이 맞는지 확인 필요함.
//        // 필요할 경우 파라미터 설정(다운로드) 명령을 새롭게 추가해서 처리해야 함.
//        VdsReqDataLength controlFan = new VdsReqDataLength(vdsObj);
//        controlFan.controlFan(eVmsReqFanControl.vms_req_fan_auto.getByteValue(), (byte)(req.getFanRunTemp() & 0xFF));
//        statusControlReq(req.getUserId(), command, controlFan);
//
//        try {
//            Thread.sleep(1000);
//        } catch (InterruptedException e) {
//            log.error("{}", e.getMessage());
//        }
//
//        VdsReqDataLength controlHeater = new VdsReqDataLength(vdsObj);
//        controlHeater.controlHeater(eVmsReqHeaterControl.vms_req_heater_auto.getByteValue(), (byte)(req.getHeaterRunTemp() & 0xFF));
//        return statusControlReq(req.getUserId(), command, controlHeater);
//    }

}
