package org.nl.acs.device_driver.tianneng.guhuashi;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.acs.device.domain.Device;
import org.nl.acs.device.service.DeviceService;
import org.nl.acs.device_driver.DeviceDriver;
import org.nl.acs.device_driver.RequestMethodEnum;
import org.nl.acs.device_driver.RouteableDeviceDriver;
import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver;
import org.nl.acs.device_driver.driver.ExecutableDeviceDriver;
import org.nl.acs.ext.wms.data.BaseRequest;
import org.nl.acs.ext.wms.data.feedBackTaskStatus.FeedBackTaskStatusRequest;
import org.nl.acs.ext.wms.service.AcsToWmsService;
import org.nl.acs.instruction.domain.Instruction;
import org.nl.acs.instruction.service.InstructionService;
import org.nl.acs.monitor.DeviceStageMonitor;
import org.nl.acs.opc.WcsConfig;
import org.nl.acs.route.service.RouteLineService;
import org.nl.acs.route.service.dto.RouteLineDto;
import org.nl.acs.task.domain.Task;
import org.nl.acs.task.service.TaskService;
import org.nl.acs.task.service.dto.TaskDto;
import org.nl.acs.task.service.mapper.TaskMapper;
import org.nl.acs.utils.ConvertUtil;
import org.nl.acs.utils.ReadUtil;
import org.nl.common.utils.CodeUtil;
import org.nl.config.SpringContextHolder;
import org.openscada.opc.lib.da.Server;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 检测站点驱动
 */
@Slf4j
@Data
@RequiredArgsConstructor
public class GuhuashiSiteDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver, DeviceStageMonitor {
    protected ItemProtocol itemProtocol = new ItemProtocol(this);

    private AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl");
    ;

    String devicecode;

    private Date instruction_require_time = new Date();
    private int instruction_require_time_out = 60000;


    @Override
    public Device getDevice() {
        return this.device;
    }

    int VW7010 = 0;
    int VW7012 = 0;
    int VW7014 = 0;
    int VW7016 = 0;
    int VW7018 = 0;
    int VW7020 = 0;
    int VW7022 = 0;
    int VW7024 = 0;
    int VW7026 = 0;
    int VW7028 = 0;
    int VW7030 = 0;
    int VW7032 = 0;
    int VW7034 = 0;
    int VW7036 = 0;
    int VW7038 = 0;
    int VW7040 = 0;
    int VW7042 = 0;
    int VW7044 = 0;
    int VD7046 = 0;
    int VW7056 = 0;
    int VW7058 = 0;
    int VW7076 = 0;
    int VW70001 = 0;
    int VW70002 = 0;
    int VW70003 = 0;
    int VW70004 = 0;
    int VW70005 = 0;
    int VW70006 = 0;
    int VW70007 = 0;
    int VW70020 = 0;

    int last_VW7010 = 0;
    int last_VW7012 = 0;
    int last_VW7014 = 0;
    int last_VW7016 = 0;
    int last_VW7018 = 0;
    int last_VW7020 = 0;
    int last_VW7022 = 0;
    int last_VW7024 = 0;
    int last_VW7026 = 0;
    int last_VW7028 = 0;
    int last_VW7030 = 0;
    int last_VW7032 = 0;
    int last_VW7034 = 0;
    int last_VW7036 = 0;
    int last_VW7038 = 0;
    int last_VW7040 = 0;
    int last_VW7042 = 0;
    int last_VW7044 = 0;
    int last_VD7046 = 0;
    int last_VW7056 = 0;
    int last_VW7058 = 0;
    int last_VW7076 = 0;
    int last_VW70001 = 0;
    int last_VW70002 = 0;
    int last_VW70003 = 0;
    int last_VW70004 = 0;
    int last_VW70005 = 0;
    int last_VW70006 = 0;
    int last_VW70007 = 0;
    int last_VW70020 = 0;


    @Override
    public void execute() {
        String message = null;
        try {
            devicecode = this.getDeviceCode();
            VW7010 = this.itemProtocol.getVW7010();
            VW7012 = this.itemProtocol.getVW7012();
            VW7014 = this.itemProtocol.getVW7014();
            VW7016 = this.itemProtocol.getVW7016();
            VW7018 = this.itemProtocol.getVW7018();
            VW7020 = this.itemProtocol.getVW7020();
            if("GHS01".equals(devicecode)){
                log.info("123");
            }
            VW7022 = this.itemProtocol.getVW7022();
            VW7024 = this.itemProtocol.getVW7024();
            VW7026 = this.itemProtocol.getVW7026();
            VW7028 = this.itemProtocol.getVW7028();
            VW7030 = this.itemProtocol.getVW7030();
            VW7032 = this.itemProtocol.getVW7032();
            VW7034 = this.itemProtocol.getVW7034();
            VW7036 = this.itemProtocol.getVW7036();
            VW7038 = this.itemProtocol.getVW7038();
            VW7040 = this.itemProtocol.getVW7040();
            VW7042 = this.itemProtocol.getVW7042();
            VW7044 = this.itemProtocol.getVW7044();
            VD7046 = this.itemProtocol.getVD7046();
            VW7056 = this.itemProtocol.getVW7056();
            VW7058 = this.itemProtocol.getVW7058();
            VW7076 = this.itemProtocol.getVW7076();
            VW70001 = this.itemProtocol.getVW70001();
            VW70002 = this.itemProtocol.getVW70002();
            VW70003 = this.itemProtocol.getVW70003();
            VW70004 = this.itemProtocol.getVW70004();
            VW70005 = this.itemProtocol.getVW70005();
            VW70006 = this.itemProtocol.getVW70006();
            VW70007 = this.itemProtocol.getVW70007();
            VW70020 = this.itemProtocol.getVW70020();

            if (VW70001 == 1 &&VW70020 == 0) {
            //                Date date = new Date();
            //                if (date.getTime() - this.instruction_require_time.getTime() < (long) this.instruction_require_time_out) {
            //                    log.trace("触发时间因为小于{}毫秒，而被无视", this.instruction_require_time_out);
            //                }else {
            //                    this.instruction_require_time = date;
            //                    log.info("固化室{}反馈工艺运行中，开始通知lms", devicecode);
            //                    FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
            //                    request.setDevice_code(this.devicecode);
            //                    request.setType("1");
            //                    request.setState("4");
            //                    acsToWmsService.notify(request);
            //                }
            }
            //现场要测水分，手动更改
            //            if (VW70002 != last_VW70002 && VW70002 == 1) {
            //                log.info("固化室{}反馈工艺运行结束，开始通知lms", devicecode);
            //                FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
            //                request.setDevice_code(this.devicecode);
            //                request.setType("1");
            //                request.setState("5");
            //                acsToWmsService.notify(request);
            //            }
            //            if (VD7046 != last_VD7046 && VD7046 == 0) {
            ////                log.info("固化室{}反馈固化室恢复正常，开始通知lms", devicecode);
            ////                FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
            ////                request.setDevice_code(this.devicecode);
            ////                request.setType("3");
            ////                request.setState(String.valueOf(VD7046));
            ////                acsToWmsService.notify(request);
            ////            }else if(VD7046 != last_VD7046) {
            ////                log.info("固化室{}反馈固化室发生异常，开始通知lms", devicecode);
            ////                FeedBackTaskStatusRequest request = new FeedBackTaskStatusRequest();
            ////                request.setDevice_code(this.devicecode);
            ////                request.setType("3");
            ////                request.setState(String.valueOf(VD7046));
            ////                acsToWmsService.notify(request);
            ////            }
        } catch (Exception var17) {
            return;
        }
        last_VW7010 = VW7010;
        last_VW7012 = VW7012;
        last_VW7014 = VW7014;
        last_VW7016 = VW7016;
        last_VW7018 = VW7018;
        last_VW7020 = VW7020;
        last_VW7022 = VW7022;
        last_VW7024 = VW7024;
        last_VW7026 = VW7026;
        last_VW7028 = VW7028;
        last_VW7030 = VW7030;
        last_VW7032 = VW7032;
        last_VW7034 = VW7034;
        last_VW7036 = VW7036;
        last_VW7038 = VW7038;
        last_VW7040 = VW7040;
        last_VW7042 = VW7042;
        last_VW7044 = VW7044;
        last_VD7046 = VD7046;
        last_VW7056 = VW7056;
        last_VW7058 = VW7058;
        last_VW7076 = VW7076;
        last_VW70001 = VW70001;
        last_VW70002 = VW70002;
        last_VW70003 = VW70003;
        last_VW70004 = VW70004;
        last_VW70005 = VW70005;
        last_VW70006 = VW70006;
        last_VW70007 = VW70007;
    }


    public void executing(Server server, Map<String, Object> itemMap) {
        this.control(itemMap);
    }


    public void writing(String param, int command) {
        String to_command = this.getDevice().getOpc_server_code() + "." + this.getDevice().getOpc_plc_code() + "." + this.getDevice().getDevice_code()
                + "." + param;
        Map<String, Object> itemMap = new HashMap<>();
        itemMap.put(to_command, command);
        this.control(itemMap);
    }

    @Override
    public JSONObject getDeviceStatusName() {
        JSONObject jo = new JSONObject();
        return jo;
    }

    @Override
    public void setDeviceStatus(JSONObject data) {

    }


}
