package com.sw.common.accessory.server;

import com.sw.common.core.enums.EnumDict;
import com.sw.common.core.enums.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

import static com.sw.common.accessory.config.Constant.*;

/**
 * @author zhaowenjie
 */
public class EnumValuesAccy {

    /**
     * 使用状态（0：待上机，1：上机中，2：退库中，3：已退库 4：异常判定中）
     */
    @EnumDict(ENUM_DICT_ACCY_USE_STATUS)
    @Getter
    @AllArgsConstructor
    public enum AccyUseStatus implements EnumValue.KeyValueInt {
        /**
         * 待上机
         */
        待上机(0, "待上机"),
        /**
         * 上机中
         */
        上机中(1, "上机中"),
        /**
         * 退库中
         */
        退库中(2, "退库中"),
        /**
         * 已退库
         */
        已退库(3, "已退库"),
        /**
         * 异常判定中
         */
        异常判定中(4, "异常判定中");

        private final int key;
        private final String value;

        public static final Map<Integer, AccyUseStatus> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }

    /**
     * 预警状态
     */
    @EnumDict(ENUM_DICT_ACCY_WARNING_STATUS)
    @Getter
    @AllArgsConstructor
    public enum WarningStatus implements EnumValue.KeyValueInt {
        /**
         * 未预警
         */
        NO_WARNING(0, "未预警"),
        /**
         * 已预警
         */
        HAS_WARNING(1, "已预警");

        private final int key;
        private final String value;

        public static final Map<Integer, WarningStatus> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }

    /**
     * 退库状态（0：待接收，1：已接收，2：已取消，3：已拒收）
     */
    @EnumDict(ENUM_DICT_ACCY_RETURN_STATUS)
    @Getter
    @AllArgsConstructor
    public enum ReturnStatus {

        /**
         * 待接收
         */
        WAIT_RECEIVE(0, "待接收"),
        /**
         * 已接收
         */
        HAS_RECEIVE(1, "已接收"),
        /**
         * 已取消
         */
        HAS_CANCEL(2, "已取消"),
        /**
         * 已拒收
         */
        HAS_REJECT(3, "已拒收");

        private final int key;
        private final String value;

        public static final Map<Integer, ReturnStatus> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }

    /**
     * 申请状态（0:待出库，1:已出库，2：已取消，3:已拒绝）
     */
    @EnumDict(ENUM_DICT_ACCY_APPLY_STATUS)
    @Getter
    @AllArgsConstructor
    public enum ApplyStatus implements EnumValue.KeyValueInt {
        /**
         * 待出库
         */
        WAITING(0, "待出库"),
        /**
         * 已出库
         */
        OUT(1, "已出库"),
        /**
         * 已取消
         */
        CANCEL(2, "已取消"),
        /**
         * 已拒绝
         */
        REFUSE(3, "已拒绝");

        private final int key;
        private final String value;

        public static final Map<Integer, ApplyStatus> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }


    /**
     * 操作类型
     */
    @Getter
    @AllArgsConstructor
    public enum AccOper implements EnumValue.KeyValueInt {
        /*
         * 上机
         */
        UpperDevice(0, "上机"),
        /*
          申请退库（下机）
         */
        ApplyForStockReturn(1, "下机"),
        /*
         对调
        */
        Transfer(2, "对调"),
        /*
         * 消耗寿命
         */
        LifeConsumption(3, "寿命消耗");

        private final int key;
        private final String value;

        public static final Map<Integer, AccOper> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }

    @EnumDict(ENUM_DICT_ACCY_LIFE_TYPE)
    @Getter
    @AllArgsConstructor
    public enum LifeType implements EnumValue.KeyValueInt {
        /**
         * 炉次
         */
        lot(0, "炉次"),
        /**
         * 炉次时间
         */
        lotTimeH(1, "炉次时间/H");
        private final int key;
        private final String value;

        private static final Map<Integer, LifeType> ENUM_MAP = Arrays.stream(values()).collect(Collectors.toMap(item -> item.key, item -> item));

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }

    /**
     * 物料状态（0：新，1：返修，2：报废，3：煅烧可用）
     */
    @EnumDict(ENUM_DICT_ACCY_STATUS)
    @Getter
    @AllArgsConstructor
    public enum AccessoryStatus implements EnumValue.KeyValueInt {

        新(0, "新"),
        返修(1, "返修"),
        报废(2, "报废"),
        煅烧可用(3, "煅烧可用");

        private final int key;
        private final String value;

        public static final Map<Integer, AccessoryStatus> ENUM_MAP = new HashMap<>();

        static {
            Arrays.stream(values()).forEach(status -> ENUM_MAP.put(status.getKey(), status));
        }

        public static String getText(int key) {
            return ENUM_MAP.containsKey(key) ? ENUM_MAP.get(key).getValue() : null;
        }
    }
}