package com.gzlh.utils;


import cn.hutool.json.JSONUtil;
import com.gzlh.bus.SysConfig;
import com.gzlh.config.ModuleEnum;
import com.gzlh.config.SystemObject;
import com.gzlh.config.dto.CaputreSetting;
import com.gzlh.config.dto.SerialSetting;
import com.gzlh.device.capture.brand.CaptureBrandType;
import com.gzlh.device.electron.brand.ElectronBrandType;
import com.gzlh.device.led.brand.LedBrandType;
import com.gzlh.device.weighbridge.brand.WeighbridgeBrandType;
import com.gzlh.entity.DeviceStatus;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

public class DeviceCache {
    private static DeviceStatus deviceStatus = new DeviceStatus();
    private static Map<String, Date> plcTimeMap = new ConcurrentHashMap<String, Date>();

    static boolean interrupt = false;

    static String plcStatus = null;

    public static void setPlcStatus(String status) {
        plcStatus = status;
    }

    public static String getPlcStatus() {
        return plcStatus;
    }

    public static void putTime(String k, Date v) {
        plcTimeMap.put(k, v);
    }

    public static Date getTime(String k) {
        return plcTimeMap.get(k);
    }

    public static void resetTimeMap() {
        plcTimeMap = new ConcurrentHashMap<String, Date>();
        ;
    }

    public static String getDeviceStatusJson() {
        if (StringUtils.isEmpty(deviceStatus.getChannelCode())) {
            deviceStatusInit();
        }
        return JSONUtil.toJsonStr(deviceStatus);
    }

    public static void deviceStatusInit() {
        SerialSetting serialSetting = SysConfig.serialSetting;
        deviceStatus.setChannelCode(SysConfig.channelSetting.getChannelCode());
        deviceStatus.setChannelName(SysConfig.channelSetting.getChannelName());
        CaputreSetting caputreSetting = SysConfig.caputreSetting;
        if (caputreSetting.isEnable()) {
            DeviceStatus.Device capture = new DeviceStatus.Device(caputreSetting.getHost(),
                    caputreSetting.getPort(),
                    CaptureBrandType.getBrandByCode(caputreSetting.getBrand()),
                    ModuleEnum.CAPTURE_MODULE.getModuleZh());
            deviceStatus.getDeviceList().add(capture);
        }
        if (serialSetting.getPlc().getEnable()) {
            DeviceStatus.Device plc = new DeviceStatus.Device(serialSetting.getHost(),
                    serialSetting.getPlc().getPort(),
                    "smart 200",
                    ModuleEnum.PLC_MODULE.getModuleZh());
            deviceStatus.getDeviceList().add(plc);
        }
        if (serialSetting.getLed().getEnable()) {
            DeviceStatus.Device led = new DeviceStatus.Device(serialSetting.getHost(),
                    serialSetting.getLed().getPort(),
                    LedBrandType.getBrandByCode(serialSetting.getLed().getBrand()),
                    ModuleEnum.LED_MODULE.getModuleZh());
            deviceStatus.getDeviceList().add(led);
        }

        if (serialSetting.getWeighbridge().getEnable()) {
            DeviceStatus.Device weighbridge = new DeviceStatus.Device(serialSetting.getHost(),
                    serialSetting.getWeighbridge().getPort(),
                    WeighbridgeBrandType.getBrandByCode(serialSetting.getWeighbridge().getBrand()),
                    ModuleEnum.WEIGHBRIDGE_MODULE.getModuleZh());
            deviceStatus.getDeviceList().add(weighbridge);
        }
        if (serialSetting.getElectron().getEnable()) {
            DeviceStatus.Device electron = new DeviceStatus.Device(serialSetting.getHost(),
                    serialSetting.getElectron().getPort(),
                    ElectronBrandType.getBrandByCode(serialSetting.getElectron().getBrand()),
                    ModuleEnum.ELECTRON_MODULE.getModuleZh());
            deviceStatus.getDeviceList().add(electron);
        }
    }

    public static DeviceStatus getDeviceStatus() {
        return deviceStatus;
    }

    public static Map<String, Date> getTimeMap() {
        return plcTimeMap;
    }

    public static boolean isInterrupt() {
        return interrupt;
    }

    public static void setInterrupt(boolean interrupt) {
        DeviceCache.interrupt = interrupt;
    }

    public static void changeDeviceStatus(String name, int status) {
        List<DeviceStatus.Device> devices = DeviceCache.getDeviceStatus().getDeviceList();
        if (devices.stream().anyMatch(device -> device.getName().equalsIgnoreCase(name))) {
            devices.stream().filter(device -> device.getName().equalsIgnoreCase(name))
                    .map(e -> e.setStatus(status)).collect(Collectors.toList());
        }
    }
}