package com.hz.pm.api.common.statemachine.event;

import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
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( ProjectStatusEnum.TO_BE_DECLARED.getCode(), null, null),
    /**
     * 单位内部审核驳回(项目状态进入：单位内部审核不通过)
     */
    UNDER_INTERNAL_REJECT(null, ProjectStatusEnum.UNDER_INTERNAL_AUDIT.getCode(), null),
    /**
     * 单位内部审核通过(项目状态进入：待预审)
     */
    UNDER_INTERNAL_PASS(ProjectStatusEnum.UNDER_INTERNAL_AUDIT.getCode(), null, null),
    /**
     * 单位内部审核不通过重新提交(项目状态进入：单位内部审核中)
     */
    UNDER_INTERNAL_REJECT_RESUBMIT(ProjectStatusEnum.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(),null,null),

    /**
     * 预审申报(项目状态进入：待预审选择，有判断条件：市级项目且申报金额大于1000万项目状态变为：省级部门联审中；否则项目状态变为：预审中)
     */
    PRELIMINARY_REVIEW_DECLARE(ProjectStatusEnum.PENDING_PREQUALIFICATION.getCode(), null, null),
    /**
     * 省级部门联审不通过(项目状态变为：省级部门联审不通过)
     */
    PROVINCIAL_DEPARTMENT_REVIEW_REJECT(null, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode(), null),
    /**
     * 省级部门联审通过(项目状态变为：省级联审成功)
     */
    PROVINCIAL_DEPARTMENT_REVIEW_PASS(ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode(), null, null),

    /**
     * 去到预审(项目状态变为：预审中)
     */
    PROVINCIAL_PASS_TO_PRELIMINARY_REVIEW(ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS_SUCCESS.getCode(), null, null),
    /**
     * 预审驳回(项目状态变为：预审不通过)
     */
    PRELIMINARY_REVIEW_REJECT(null, ProjectStatusEnum.PRE_APPLYING.getCode(), null),
    /**
     * 预审不通过重新提交(项目状态变为：待预审选择)
     */
    PRELIMINARY_REVIEW_REJECT_RESUBMIT(ProjectStatusEnum.PREQUALIFICATION_FAILED.getCode(),null,null),
    /**
     * 预审通过(项目状态变为：部门联审中)
     */
    PRELIMINARY_REVIEW_PASS(ProjectStatusEnum.PRE_APPLYING.getCode(), null, null),
    /**
     * 部门联审驳回(项目状态变为：部门联审不通过)
     */
    DEPARTMENT_UNITED_REVIEW_REJECT(null, ProjectStatusEnum.DEPARTMENT_JOINT_REVIEW.getCode(), null),
    /**
     * 部门联审通过(项目状态变为：年度计划中)
     */
    DEPARTMENT_UNITED_REVIEW_PASS(ProjectStatusEnum.DEPARTMENT_JOINT_REVIEW.getCode(), null, null),
    /**
     * 年度计划暂缓(项目状态变为：被暂缓)
     */
    ANNUAL_PLAN_SUSPEND(null, ProjectStatusEnum.IN_THE_ANNUAL_PLAN.getCode(), null),
    /**
     * 年度计划项目开启方案申报(项目状态变为：方案待申报)
     */
    ANNUAL_PLAN_PROJECT_OPEN_PLAN_DECLARE(ProjectStatusEnum.IN_THE_ANNUAL_PLAN.getCode(), null, null),
    /**
     * 申报方案(项目状态变为：方案评审中)
     */
    DECLARE_PLAN( ProjectStatusEnum.PLAN_TO_BE_DECLARED.getCode(), null, null),
    /**
     * 方案评审驳回(项目状态变为：方案评审不通过)
     */
    PLAN_REVIEW_REJECT(null, ProjectStatusEnum.SCHEME_UNDER_REVIEW.getCode(), null),
    /**
     * 方案评审不通过重新提交(项目状态变为：方案评审中)
     */
    PLAN_REVIEW_REJECT_RESUBMIT(ProjectStatusEnum.SCHEME_REVIEW_FAILED.getCode(),null,null),
    /**
     * 方案评审通过(项目状态变为：待立项批复)
     */
    PLAN_REVIEW_PASS(ProjectStatusEnum.SCHEME_UNDER_REVIEW.getCode(), null, null),
    /**
     * 立项批复(项目状态变为：已立项-待采购)
     */
    PROJECT_APPROVAL(ProjectStatusEnum.TO_BE_APPROVED.getCode(), null, null),

    /**
     * 注册应用
     */
    REGISTER_APP(ProjectStatusEnum.TO_BE_APP_REGISTER.getCode(), null, null),
    /**
     * 采购备案(项目状态变为：待开工)
     */
    PURCHASE_PUT_ON_RECORD(ProjectStatusEnum.TO_BE_PURCHASED.getCode(), null, null),

    /**
     * 开工 到建设中
     */
    START_TO_WORK(ProjectStatusEnum.OPERATION.getCode(), null,null),
    /**
     * 初验备案(项目状态变为：待终验)
     */
    PRELIMINARY_ACCEPTANCE_PUT_ON_RECORD(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode(), null, null),
    /**
     * 终验申请(项目状态变为：终验审核中)
     */
    FINAL_ACCEPTANCE_APPLICATION(ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode(), null, null),
    /**
     * 终验审核不通过(项目状态变为：终验审核不通过)
     */
    FINAL_ACCEPTANCE_REJECT(null, ProjectStatusEnum.FINAL_ACCEPTANCE_IS_UNDER_REVIEW.getCode(), null),
    /**
     * 终验审核通过(项目状态变为：已归档)
     */
    FINAL_ACCEPTANCE_PASS(ProjectStatusEnum.FINAL_ACCEPTANCE_IS_UNDER_REVIEW.getCode(), null, null),

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

    /**
     * 单位内部审核中时被撤回(项目状态进入：待申报)
     */
    UNDER_INTERNAL_WITHDRAW(null, null, ProjectStatusEnum.UNDER_INTERNAL_AUDIT.getCode()),
    /**
     * 省级部门联审中时被撤回(项目状态进入：待预审)
     */
    JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS_WITHDRAW(null, null, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode()),
    /**
     * 预审中时被撤回(项目状态进入：待预审选择，，有判断条件：市级项目且申报金额大于1000万项目状态变为：省级部门联审通过；否则项目状态变为：待预审)
     */
    PRE_APPLYING_WITHDRAW(null, null, ProjectStatusEnum.PRE_APPLYING.getCode()),
    /**
     * 部门联审中时被撤回(项目状态进入：预审中)
     */
    DEPARTMENT_JOINT_REVIEW_WITHDRAW(null, null, ProjectStatusEnum.DEPARTMENT_JOINT_REVIEW.getCode()),
    /**
     * 方案评审中时被撤回(项目状态进入：方案待申报)
     */
    SCHEME_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatusEnum.SCHEME_UNDER_REVIEW.getCode()),
    /**
     * 终验审核中时被撤回(项目状态进入：待终验)
     */
    FINAL_ACCEPTANCE_IS_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatusEnum.FINAL_ACCEPTANCE_IS_UNDER_REVIEW.getCode()),

    /**
     * 重新提交 终验
     */
    FINAL_RE_ACCEPTANCE_APPLICATION(ProjectStatusEnum.FINAL_ACCEPTANCE_REVIEW_FAILED.getCode(), null, null);


    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;
    }
}
