package com.ningdatech.pmapi.common.statemachine.event;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Objects;

/**
 * 项目状态改变事件
 *
 * @author CMM
 * @return
 * @since 2023/02/07 9:22
 */
@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum ProjectStatusChangeEvent {

    /**
     * 项目申报暂存(项目状态进入：待申报)
     */
    PROJECT_APPLICATION_HOLD(null, null, null),
    /**
     * 项目申报提交(项目状态进入：单位内部审核中)
     */
    PROJECT_APPLICATION_SUBMIT(10015, null, null),
    /**
     * 单位内部审核驳回(项目状态进入：单位内部审核不通过)
     */
    UNDER_INTERNAL_REJECT(null, 10001, null),
    /**
     * 单位内部审核通过(项目状态进入：待预审)
     */
    UNDER_INTERNAL_PASS(10001, null, null),
    /**
     * 预审申报(项目状态进入：待预审选择，有判断条件：市级项目且申报金额大于1000万项目状态变为：省级部门联审中；否则项目状态变为：预审中)
     */
    PRELIMINARY_REVIEW_DECLARE(10003, null, null),
    /**
     * 省级部门联审不通过(项目状态变为：省级部门联审不通过)
     */
    PROVINCIAL_DEPARTMENT_REVIEW_REJECT(null, 10004, null),
    /**
     * 省级部门联审通过(项目状态变为：预审中)
     */
    PROVINCIAL_DEPARTMENT_REVIEW_PASS(10004, null, null),
    /**
     * 预审驳回(项目状态变为：预审不通过)
     */
    PRELIMINARY_REVIEW_REJECT(null, 10006, null),
    /**
     * 预审通过(项目状态变为：部门联审中)
     */
    PRELIMINARY_REVIEW_PASS(10006, null, null),
    /**
     * 部门联审驳回(项目状态变为：部门联审不通过)
     */
    DEPARTMENT_UNITED_REVIEW_REJECT(null, 10008, null),
    /**
     * 部门联审通过(项目状态变为：年度计划中)
     */
    DEPARTMENT_UNITED_REVIEW_PASS(10008, null, null),
    /**
     * 年度计划暂缓(项目状态变为：被暂缓)
     */
    ANNUAL_PLAN_SUSPEND(null, 10010, null),
    /**
     * 年度计划项目开启方案申报(项目状态变为：方案待申报)
     */
    ANNUAL_PLAN_PROJECT_OPEN_PLAN_DECLARE(10010, null, null),
    /**
     * 申报方案(项目状态变为：方案评审中)
     */
    DECLARE_PLAN(10016, null, null),
    /**
     * 方案评审驳回(项目状态变为：方案评审不通过)
     */
    PLAN_REVIEW_REJECT(null, 10012, null),
    /**
     * 方案评审通过(项目状态变为：待立项批复)
     */
    PLAN_REVIEW_PASS(10012, null, null),
    /**
     * 立项批复(项目状态变为：已立项-待采购)
     */
    PROJECT_APPROVAL(10014, null, null),
    /**
     * 采购备案(项目状态变为：建设中)
     */
    PURCHASE_PUT_ON_RECORD(20001, null, null),
    /**
     * 初验备案(项目状态变为：待终验)
     */
    PRELIMINARY_ACCEPTANCE_PUT_ON_RECORD(20002, null, null),
    /**
     * 终验申请(项目状态变为：终验审核中)
     */
    FINAL_ACCEPTANCE_APPLICATION(20003, null, null),
    /**
     * 终验审核不通过(项目状态变为：终验审核不通过)
     */
    FINAL_ACCEPTANCE_REJECT(null, 20004, null),
    /**
     * 终验审核通过(项目状态变为：已归档)
     */
    FINAL_ACCEPTANCE_PASS(20004, null, null),

    // 下个节点还未提交审核意见时，流程发起人和前一个审核人可以点击撤回

    /**
     * 单位内部审核中时被撤回(项目状态进入：待申报)
     */
    UNDER_INTERNAL_WITHDRAW(null, null, 10001),
    /**
     * 省级部门联审中时被撤回(项目状态进入：待预审)
     */
    JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS_WITHDRAW(null, null, 10004),
    /**
     * 预审中时被撤回(项目状态进入：待预审选择，，有判断条件：市级项目且申报金额大于1000万项目状态变为：省级部门联审中；否则项目状态变为：预审中)
     */
    PRE_APPLYING_WITHDRAW(null, null, 10006),
    /**
     * 部门联审中时被撤回(项目状态进入：预审中)
     */
    DEPARTMENT_JOINT_REVIEW_WITHDRAW(null, null, 10008),
    /**
     * 方案评审中时被撤回(项目状态进入：方案待申报)
     */
    SCHEME_UNDER_REVIEW_WITHDRAW(null, null, 10012),
    /**
     * 终验审核中时被撤回(项目状态进入：待终验)
     */
    FINAL_ACCEPTANCE_IS_UNDER_REVIEW_WITHDRAW(null, null, 20004);

    private Integer passProjectStatusCode;
    private Integer rejectProjectStatusCode;
    private Integer withdrawProjectStatusCode;

    public static ProjectStatusChangeEvent getPassValueByCode(Integer code) {
        if (Objects.isNull(code)) {
            return null;
        }
        for (ProjectStatusChangeEvent t : ProjectStatusChangeEvent.values()) {
            if (code.equals(t.getPassProjectStatusCode())) {
                return t;
            }
        }
        return null;
    }

    public static ProjectStatusChangeEvent getRejectValueByCode(Integer code) {
        if (Objects.isNull(code)) {
            return null;
        }
        for (ProjectStatusChangeEvent t : ProjectStatusChangeEvent.values()) {
            if (code.equals(t.getRejectProjectStatusCode())) {
                return t;
            }
        }
        return null;
    }

    public static ProjectStatusChangeEvent getWithdrawValueByCode(Integer code) {
        if (Objects.isNull(code)) {
            return null;
        }
        for (ProjectStatusChangeEvent t : ProjectStatusChangeEvent.values()) {
            if (code.equals(t.getWithdrawProjectStatusCode())) {
                return t;
            }
        }
        return null;
    }
}
