package com.its.op.service.its.vms;

import com.its.op.dto.its.vms.TbVmsCtrlHsDto;
import com.its.op.dto.its.vms.VmsControlDto;
import com.its.op.dao.repository.its.vms.TbVmsCtlrRepository;
import com.its.op.dao.repository.its.vms.TbVmsCtrlHsRepository;
import com.its.op.xnetudp.protocol.CENTER_COMM_DEFINE;
import com.its.op.xnetudp.service.VmsServerRequestSender;
import com.its.utils.ItsUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@Slf4j
@RequiredArgsConstructor
@Service
public class VmsControlService {

    private final VmsServerRequestSender vmsServerRequestSender;
    private final TbVmsCtlrRepository repo;
    private final TbVmsCtrlHsRepository repoCtrlHs;

    /**
     * VMS 제어 이력 저장
     * @param dto
     */
    @Transactional
    public void saveCtrlHs(TbVmsCtrlHsDto dto) {
        this.repoCtrlHs.insertHs(dto.getCtrlDt(), dto.getVmsCtlrNmbr(), dto.getCtrlType(), dto.getCtrlVal(), dto.getCtrlResult(), dto.getUserId());
    }

    /**
     * VMS 제어기 리셋
     * @param id
     * @param req
     * @return
     */
    public VmsControlDto.VmsControlRes controlReset(Long id, VmsControlDto.VmsControlReq req) {
        log.warn("controlReset: {}, {}", id, req);
        boolean isSendMsg = this.vmsServerRequestSender.requestReset(id, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType("V03")
                .ctrlVal("Reset")
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 전광판 On/Off 제어
     * @param id
     * @param req
     * @return
     */
    public VmsControlDto.VmsControlRes controlPower(Long id, VmsControlDto.VmsControlReq req) {
        boolean isSendMsg = this.vmsServerRequestSender.requestPowerControl(id, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType(req.getValue() == 0 ? "V01" : "V02")
                .ctrlVal(req.getValue() == 0 ? "On" : "Off")
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 휘도 제어
     * @param id
     * @param req
     * @return
     */
    public VmsControlDto.VmsControlRes controlLuminance(Long id, VmsControlDto.VmsControlReq req) {
        boolean isSendMsg = this.vmsServerRequestSender.controlLuminance(id, req);
        String cmdValue = String.format("%d,%d,%d,%d", req.getValue(), req.getCurrStep(), req.getWeekStep(), req.getNghtStep());
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType("V07")
                .ctrlVal(cmdValue)
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 파라미터 설정
     * @param id
     * @param req
     * @return
     */
    @Transactional
    public VmsControlDto.VmsControlRes controlParam(Long id, VmsControlDto.VmsControlParamReq req) {
        this.repo.updateParam(id, req.getFanRunTmpr(), req.getHetrRunTmpr(), req.getPanlOnTime(), req.getPanlOffTime());
        boolean isSendMsg = this.vmsServerRequestSender.controlParam(id, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType("V04")
                //.ctrlVal(String.format("%d.%d,%d,%d,%d,%d,%d", req.getSchMsgTime(), req.getModuleTemp(), req.getFanTemp(), req.getHeaterTemp(), req.getModuleFail(), req.getRetryCount(), req.getTimeOut()))
                .ctrlVal(String.format("%d.%d,%s,%s", req.getFanRunTmpr(), req.getHetrRunTmpr(), req.getPanlOnTime(), req.getPanlOffTime()))
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 전광판 ON/OFF 시각 설정
     * @param id
     * @param req
     * @return
     */
    @Transactional
    public VmsControlDto.VmsControlRes controlOnOffTime(Long id, VmsControlDto.VmsControlOnOffTimeReq req) {
        this.repo.updateOnOffTime(id, req.getOnTime(), req.getOffTime());
        boolean isSendMsg = this.vmsServerRequestSender.controlOnOffTime(id, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType("V05")
                .ctrlVal(String.format("%s %s", req.getOnTime(), req.getOffTime()))
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 운영모드 설정
     * @param id
     * @param req
     * @return
     */
    @Transactional
    public VmsControlDto.VmsControlRes controlOprMode(Long id, VmsControlDto.VmsControlOprModeReq req) {
        this.repo.updateOprMode(id, req.getOprMode());
        boolean isSendMsg = this.vmsServerRequestSender.controlOprMode(id, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(id)
                .ctrlType("V06")
                .ctrlVal(req.getOprMode())
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 폼 시나리오 즉시 다운로드
     * @param ctlrNmbr
     * @param req
     * @return
     */
    public VmsControlDto.VmsControlRes controlImmScnrDnld(Long ctlrNmbr, VmsControlDto.VmsControlReq req) {
        boolean isSendMsg = this.vmsServerRequestSender.controlImmScnrDnld(ctlrNmbr, req);
        saveCtrlHs(TbVmsCtrlHsDto.builder()
                .ctrlDt(ItsUtils.getSysTime())
                .vmsCtlrNmbr(ctlrNmbr)
                .ctrlType("V10")
                .ctrlVal("Immediately Scenario Download")
                .ctrlResult(isSendMsg ? 1 : 0)
                .userId(req.getUserId())
                .build());
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 이미지 심볼 리로드
     * @return
     */
    public VmsControlDto.VmsControlRes controlNotifyImageSymbol() {
        boolean isSendMsg = this.vmsServerRequestSender.controlNotify(CENTER_COMM_DEFINE.INT_OP_VMS_IMAGE_SYMBOL);
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 제어기 이미지 트레픽 리로드
     * @return
     */
    public VmsControlDto.VmsControlRes controlNotifyImageTraffic() {
        boolean isSendMsg = this.vmsServerRequestSender.controlNotify(CENTER_COMM_DEFINE.INT_OP_VMS_IMAGE_TRAFFIC);
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS 폼 리로드
     * @return
     */
    public VmsControlDto.VmsControlRes controlNotifyVmsForm() {
        boolean isSendMsg = this.vmsServerRequestSender.controlNotify(CENTER_COMM_DEFINE.INT_OP_VMS_FORM_UPDATE);
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }

    /**
     * VMS IFSC 리로드
     * @return
     */
    public VmsControlDto.VmsControlRes controlNotifyVmsIfsc() {
        boolean isSendMsg = this.vmsServerRequestSender.controlNotify(CENTER_COMM_DEFINE.INT_OP_VMS_IFSC_UPDATE);
        if (isSendMsg) {
            return new VmsControlDto.VmsControlRes(0, "success");
        }
        return new VmsControlDto.VmsControlRes(9, "VMS 서버로 제어 명령 전송 중 알수 없는 오류가 발생 하였습니다.");
    }
}
