package com.pwt;

import com.pwt.cloud.params.ChargeFinishParam;
import com.pwt.common.enums.ChargerFault;
import com.pwt.netty.StationUIData;
import com.pwt.netty.client.PlcClient;
import com.pwt.netty.common.constants.Constants;
import com.pwt.netty.common.plc.PlcStateInfo;
import com.pwt.netty.message2.*;
import com.pwt.web.domain.PwtChangeBatteryRecord;
import com.pwt.web.domain.PwtHolderBatteryStateCache;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;


public class Globals {

    /** 换电记录 */
    public static PwtChangeBatteryRecord record = new PwtChangeBatteryRecord();

    public static ChargeFinishParam chargeFinishParam = new ChargeFinishParam();
    /**
     * 新换入临时电池的位置
     */
    public static volatile String tempBatteryPlace;
    public static volatile PlcStateInfo plcStateInfo;

    public static volatile String emergencyChargerId;

    public static PlcClient plcClient;

    /**
     * future for 换电或换仓任务。
     * 用于手动结束换电/换仓或者在2级以上故障时结束换电/换仓
     */
    public static volatile Future<?> exchangeFuture;

    /**
     * 用于换仓时等待换电步骤通知
     */
    public static volatile CompletableFuture<Void> moveBatteryFuture;

    public static final StationUIData uiData = new StationUIData();

    public static final String ASSIST_MEDIA_BASE_PATH = "http://localhost:8080/static/";


    //region 站控参数
    // 仓位配置类型(2表示带有一拖二充电机)
    public static final int HOLDER_CONFIG_TYPE = 1;
    public static final int MAX_HOLDER_COUNT = 8;
    public static final int ACTUAL_HOLDER_COUNT = 8;

    // 最大充电模块数，决定给UI返回的数量
    public static final int MAX_CHARGER_MODULE_COUNT = 8;

    public static final int ACTUAL_CHARGER_MODULE_COUNT = 8;

    public static final Map<String, Integer> CHARGE_INDEX_MAP = new HashMap<>();

    public static final List<ChargerConfig> CHARGER_CONFIGS = new ArrayList<>();
    public static final Map<String, Integer> GUN_INDEX_MAP = new HashMap<>();

    // region 运营数据
    public static LocalDateTime startDateTime = LocalDateTime.of(2023, 9, 8, 0, 0, 0);

    public static volatile AtomicInteger OP_EXCHANGE_COUNT = new AtomicInteger(0);
    public static volatile AtomicReference<Double> OP_EXCHANGE_POWER =  new AtomicReference<>();
    public static volatile AtomicInteger OP_REGISTER_CAR_COUNT = new AtomicInteger(0);
    // endregion


    // TODO 保存到数据库有BUG
    // 用于站控启动时加载上一次的电池信息
    /**
     * key: 仓位号
     * value: 电池缓存
     */
    public static Map<Integer, PwtHolderBatteryStateCache> holderBatteryStateCacheMap;

    /**
     * 应急充电缓存记录
     */
    public static Map<Integer, PwtHolderBatteryStateCache> emergencyHolderBatteryCacheMap = new ConcurrentHashMap<>();

    public static final Map<String, BatteryStateInfo> HOLDER_BATTERY_STATE_INFO = new ConcurrentHashMap<>();
    public static final Map<String, BatteryInfo> HOLDER_BATTERY_INFO = new ConcurrentHashMap<>();


    @Data
    static class ChargerConfig {
        private String ip;
        private boolean enableEmergency;
        private String id;
    }

    //endregion

//    static {
//        // region 初始化枪的配置
//        // TODO 从配置加载配置
//        ChargerConfig chargeConfig13 = new ChargerConfig();
//        chargeConfig13.setIp("192.168.3.41");
//        chargeConfig13.setId("GHLN07149CDJ1");// 1、3号仓位充电机
//        CHARGE_INDEX_MAP.put("GHLN07149CDJ1", 1);
//        CHARGER_CONFIGS.add(chargeConfig13);
//
//
//        ChargerConfig chargeConfig2 = new ChargerConfig();
//        chargeConfig2.setIp("192.168.3.42");
//        chargeConfig2.setId("GHLN07149CDJ2");// 2号仓位充电机
//        chargeConfig2.setEnableEmergency(true);
//        CHARGE_INDEX_MAP.put("GHLN07149CDJ2", 2);
//        CHARGER_CONFIGS.add(chargeConfig2);
//
//        ChargerConfig chargeConfig4 = new ChargerConfig();
////        chargeConfig2.setEnableEmergency(true);
//        chargeConfig4.setIp("192.168.3.44");
//        chargeConfig4.setId("GHLN07149CDJ4");// 4号仓位充电机
//        CHARGE_INDEX_MAP.put("GHLN07149CDJ4", 3);
//        CHARGER_CONFIGS.add(chargeConfig4);
//        // endregion
//
//        // 仓位
//        ArrayList<BatteryHolder> holders = new ArrayList<>(MAX_HOLDER_COUNT);
//        for (int i = 1; i <= MAX_HOLDER_COUNT; i++) {
//            BatteryHolder holder = new BatteryHolder();
//            holder.setIndex(i);
//            holder.setId(String.valueOf(i));
//            holder.setName("#"+i);
//            if(i> ACTUAL_HOLDER_COUNT) {
//                holder.setEnable(false);
//            }
//            holders.add(holder);
//        }
//        uiData.setBatteryHolders(holders);
//
//        // 充电机
//        int chargerCount = CHARGER_CONFIGS.size();
//        ArrayList<Charger> chargers = new ArrayList<>(chargerCount);
//        ArrayList<ChargerGun> guns = new ArrayList<>();
//        for (int i = 1; i <= chargerCount ; i++) {
//            ChargerConfig chargerConfig = CHARGER_CONFIGS.get(i - 1);
//            Charger c = new Charger();
//            c.setCommunicationState(Constants.NET_CONNECTION_STATE_OFFLINE);
//            c.setId(chargerConfig.getId());
//
//            c.setName("#"+i);
//            c.setIndex(i);
//            List<ChargerModule> modules = new ArrayList<>(MAX_CHARGER_MODULE_COUNT);
//            for (int j = 1; j <= MAX_CHARGER_MODULE_COUNT ; j++) {
//                ChargerModule m = new ChargerModule();
//                m.setIndex(j);
//                modules.add(m);
//            }
//            c.setChargeModule(modules);
//            c.setEnableEmergency(chargerConfig.isEnableEmergency());
//            chargers.add(c);
//
//            // 计算枪的数量（主枪和应急充电枪），默认一个充电机只有一个主枪
//            int gunCount = 1;
//
//            // 仅显示主枪
//            if(i == 1) {
//                // 仓位配置2，1拖2，有2把主枪
//                if(HOLDER_CONFIG_TYPE == 2) {
//                    gunCount = 2;
//                }
//            }
//            // 其他的枪可以设置为应急充电枪，此时除了1把主枪还有两把枪可以做为应急充电枪
//            else if(chargerConfig.enableEmergency) {
//                gunCount = 3;
//            }
//
//            for (int j = 1; j <= gunCount ; j++) {
//                // 计算枪号
//                int gunNo;
//                // 1拖1时，主枪为1号
//                if(gunCount == 1) {
//                    gunNo = 1;
//                }
//                // 1拖2时，主枪为1号,3号
//                else if(gunCount == 2) {
//                    if(j == 1) {
//                        gunNo = 1;
//                    } else {
//                        gunNo = 3;
//                    }
//                } else {
//                    // 带有应急充电枪的充电机
//                    // #1为仓位使用的充电机
//                    if(j == 1) {
//                        gunNo = 1;
//                    } else {
//                        // #3,#4为外作为应急充电枪
//                        gunNo = j + 1;
//                    }
//                }
//
//                int holderId = 0;
//                if(HOLDER_CONFIG_TYPE == 1) {
//                    // 配置1 仓位和充电机一样多
//                    // 只有主枪在仓位上
//                    if(gunNo == 1) {
//                        holderId = i;
//                    }
//                } else {
//                    // 配置2
//                    // 第一个充电机
//                    if(i == 1) {
//                        // 1,2 在3号仓
//                        if(gunNo == 1) {
//                            holderId = 3;
//                        } else {
//                            // 3,4 在1号仓
//                            holderId = 1;
//                        }
//                    } else if(i == 2) {
//                        // 第2个充电机
//                        if(gunNo == 1) {
//                            holderId = 2;
//                        }
//                    } else {
//                        // 其他充电机所在仓位往后顺延1个
//                        if(gunNo == 1) {
//                            holderId = i + 1;
//                        }
//                    }
//                }
//                String holderIdStr;
//                if(holderId == 0) {
//                    holderIdStr = null;
//                } else {
//                    holderIdStr = String.valueOf(holderId);
//                }
//                ChargerGun gun = new ChargerGun();
//                gun.setHolderId(holderIdStr);
//                gun.setIndex(j);
//                gun.setName("#"+gunNo);
//                gun.setChargerId(c.getId());
//                gun.setId(c.getId()+gunNo);
//                guns.add(gun);
//                GUN_INDEX_MAP.put(gun.getId(), guns.size());
//            }
//        }
//        uiData.setChargers(chargers);
//        uiData.setChargerGuns(guns);
//
//        // 运营数据
//        uiData.setOperationData(new OperationData());
//        AvailableBatteryStats availableBatteryStats = new AvailableBatteryStats(ACTUAL_HOLDER_COUNT);
//        uiData.setAvailableBatteryStats(availableBatteryStats);
//
//        // 初始化数量
//        for (int i = 1 ; i <=5; i++) {
//            AlarmStatistics alarmStatistics = new AlarmStatistics();
//            alarmStatistics.setSourceDeviceType(i);
//            alarmStatistics.setCount(0);
//            uiData.getAlarmStats().add(alarmStatistics);
//        }
//
//        for (ChargerFault value : ChargerFault.values()) {
//            Globals.uiData.getGunAlarms().add(new GunAlarmTemplate(value.getErrCode()+"", value.getErrMsg()));
//        }
//    }
}
