package com.boco.nbd.wios.flow.enums;

import cn.hutool.core.convert.Convert;
import com.boco.nbd.cams.core.constant.CamsConstant;
import com.boco.nbd.framework.workflow.entity.SubmitTypeEnum;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.boco.nbd.wios.manage.entity.cams.enums.OrderStatus;

/**
 * @author:cao hai
 * @date:2022/6/29 16:59
 * @version:V1.0
 * @description:流程节点枚举
 * @modify:
 */
public enum FlowNodeEnum {

    /**
     * 集中分析流程节点枚举
     * NODE_120(120, "订单回访")=》取消节点
     */
    NODE_BACK(-1, "驳回"), NODE_START(0, "开始"),

    NODE_101(101, "首联"), NODE_102(102, "待派单"),

    NODE_103(103, "接单"), NODE_104(104, "勘测预约"),

    NODE_105(105, "待勘测"), NODE_106(106, "待勘测资料上传"),

    NODE_107(107, "勘测资料审核"), NODE_108(108, "预约安装"),

    NODE_109(109, "安装预约变更"), NODE_110(110, "待安装"),

    NODE_111(111, "待安装资料上传"), NODE_112(112, "安装资料审核"),

    NODE_113(113, "上传开票系统"), NODE_114(114, "更新结算状态"),

    NODE_115(115, "电力报装"),
    NODE_END(199, "归档");

    FlowNodeEnum(Integer key, String value) {
        this.value = value;
        this.key = key;
    }

    public String getValue() {
        return value;
    }


    public Integer getKey() {
        return key;
    }

    /**
     * 枚举值
     */
    private String value;

    /**
     * 枚举
     */
    private Integer key;

    /**
     * 判断是否包含key
     *
     * @param key
     * @return
     */
    public static Boolean contains(Integer key) {
        FlowNodeEnum[] enums = FlowNodeEnum.values();
        for (int i = 0; i < enums.length; i++) {
            if (enums[i].getKey().equals(key)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取枚举
     *
     * @param key
     * @return
     */
    public static FlowNodeEnum getEnum(Integer key) {
        FlowNodeEnum[] enums = FlowNodeEnum.values();
        for (FlowNodeEnum item : enums) {
            if (item.getKey().equals(key)) {
                return item;
            }
        }

        return null;
    }

    /**
     * 获取订单安装项目表 type
     *
     * @param currentNode
     * @return
     */
    public static Integer getInstallItemType(FlowNodeEnum currentNode) {
        switch (currentNode) {
            case NODE_105:
            case NODE_106:
                return WiosConstant.SURVEY_TYPE;
            case NODE_110:
            case NODE_111:
                return WiosConstant.INSTALL_TYPE;
            default:
                break;
        }
        return null;
    }

    /**
     * 获取节点名称
     *
     * @param flowNodeEnum
     * @return
     */
    public static String getFlowNodeStr(FlowNodeEnum flowNodeEnum) {
        if (flowNodeEnum == null) {
            return "";
        }

        return flowNodeEnum.getKey() + CamsConstant.DASH_FLAG + flowNodeEnum.getValue();
    }

    /**
     * 保留一期逻辑
     * 104=>104 存在两种状态,逻辑上应该是存在问题的,目前104=104的记录不返回界面
     *
     * @param currentNode
     * @param nextNode
     * @return
     */
    public static OrderStatus getOrderStatus(String currentNode, String nextNode) {
        FlowNodeEnum currentNodeEnum = getEnum(Convert.toInt(currentNode));
        FlowNodeEnum nextNodeEnum = getEnum(Convert.toInt(nextNode));
        return getOrderStatus(null, currentNodeEnum, nextNodeEnum);
    }

    /**
     * 新建:0
     * 首联:101=》102[DISPATCHING(待派单)]
     * 待派单:102=>
     * 接单:103=>104[SURVEY_RESERVING(勘测待预约)]
     * 勘测预约:104=>104[SURVEY_RESERVE_EXCEPTION(勘测预约异常)、SURVEY_DISPATCHED],105[SURVEY_RESERVED(勘测已预约)]
     * 勘察完成:105=>106[SURVEY_FINISH(勘测完成)]
     * 上传资料:106=>107[SURVEY_EXAMINING(勘测完成待审核)]
     * 勘察资料审核:107=>108[SURVEY_EXAMINE_SUCCESS(勘测审核通过)],106[SURVEY_RECTIFYING(勘测待整改)]
     * 预约安装:108=>109[INSTALL_RESERVE_EXCEPTION(安装预约异常)],110[INSTALL_RESERVED(安装已预约)]
     * 安装预约变更:109=>108[INSTALL_RESERVE_EXCEPTION(安装预约异常)],110[INSTALL_RESERVED(安装已预约)]
     * 安装完成:110=>111[INSTALL_FINISH(安装完成)]
     * 上传资料:111=>112[INSTALL_EXAMINING(安装完成待审核)]
     * 资料审核:112=>111[INSTALL_RECTIFYING(安装待整改)],113[INSTALL_EXAMINE_SUCCESS(安装审核通过)]
     * 上传开票系统:113
     * 更新结算状态:114
     *
     * @param submitTypeEnum
     * @param currentNode
     * @param nextNode
     * @return
     */
    public static OrderStatus getOrderStatus(SubmitTypeEnum submitTypeEnum, FlowNodeEnum currentNode, FlowNodeEnum nextNode) {
        if (currentNode == null || nextNode == null) {
            return null;
        }
        if (FlowNodeEnum.NODE_END.equals(nextNode)) {
            return OrderStatus.CLOSED;
        }
        if (SubmitTypeEnum.Transfer.equals(submitTypeEnum) && currentNode.equals(nextNode)) {
            if (FlowNodeEnum.NODE_104.equals(currentNode) || FlowNodeEnum.NODE_105.equals(currentNode) || FlowNodeEnum.NODE_106.equals(currentNode)) {
                return OrderStatus.SURVEY_DISPATCHED;
            }
        }
        switch (currentNode) {
            case NODE_101:
                return FlowNodeEnum.NODE_102.equals(nextNode) ? OrderStatus.DISPATCHING : null;
            case NODE_103:
                return FlowNodeEnum.NODE_104.equals(nextNode) ? OrderStatus.SURVEY_RESERVING : null;
            case NODE_104:
                if (FlowNodeEnum.NODE_104.equals(nextNode)) {
                    return OrderStatus.SURVEY_RESERVE_EXCEPTION;
                } else if (FlowNodeEnum.NODE_105.equals(nextNode)) {
                    return OrderStatus.SURVEY_RESERVED;
                }
                break;
            case NODE_105:
                if (FlowNodeEnum.NODE_106.equals(nextNode)) {
                    return OrderStatus.SURVEY_FINISH;
                }
                break;
            case NODE_106:
                if (FlowNodeEnum.NODE_107.equals(nextNode)) {
                    return OrderStatus.SURVEY_EXAMINING;
                }
                break;
            case NODE_107:
                if (FlowNodeEnum.NODE_108.equals(nextNode)) {
                    return OrderStatus.SURVEY_EXAMINE_SUCCESS;
                } else if (FlowNodeEnum.NODE_106.equals(nextNode)) {
                    return OrderStatus.SURVEY_RECTIFYING;
                }
                break;
            case NODE_108:
                if (FlowNodeEnum.NODE_109.equals(nextNode)) {
                    return OrderStatus.INSTALL_RESERVE_EXCEPTION;
                } else if (FlowNodeEnum.NODE_110.equals(nextNode)) {
                    return OrderStatus.INSTALL_RESERVED;
                }
                break;
            case NODE_109:
                if (FlowNodeEnum.NODE_108.equals(nextNode)) {
                    return OrderStatus.INSTALL_RESERVE_EXCEPTION;
                } else if (FlowNodeEnum.NODE_110.equals(nextNode)) {
                    return OrderStatus.INSTALL_RESERVED;
                }
                break;
            case NODE_110:
                if (FlowNodeEnum.NODE_111.equals(nextNode)) {
                    return OrderStatus.INSTALL_FINISH;
                }
                break;
            case NODE_111:
                if (FlowNodeEnum.NODE_112.equals(nextNode)) {
                    return OrderStatus.INSTALL_EXAMINING;
                }
                break;
            case NODE_112:
                if (FlowNodeEnum.NODE_111.equals(nextNode)) {
                    return OrderStatus.INSTALL_RECTIFYING;
                } else if (FlowNodeEnum.NODE_113.equals(nextNode)) {
                    return OrderStatus.INSTALL_EXAMINE_SUCCESS;
                }
                break;
            default:
                break;
        }
        return null;
    }

}