package digital.laboratory.platform.entrustment.enums;

import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 委托状态类
 * <p>
 * 在委托中除了保存委托的当前状态之外，还保存委托进行当前状态之前的状态。
 * 如果两个状态都是待提交, 则说明委托真的是刚创建待提交，而不是从其他的审核、审批节点转过来的。
 *
 * 状态分为两个部分: 流程中的位置, 原因
 * 例如委托在处于"等待提交"时, 这是流程中的位置, 此时创建者可以对委托进行修改、取消、提交等操作。
 * 达到这个位置的原因可能是: 已创建等提交、审核被驳回、审批被驳回、送检确认被驳回、受理被拒等
 * 业务本身并不关心达到这个位置的原因, 但是用户关心。所以, 我们分成2个部分, 以避免程序的复杂性。
 */

@Getter
@RequiredArgsConstructor
public enum EntrustStatusConstants {

	ENTRUST_STATUS_CREATED(0, "待提交"),					// 已创建待提交

//	ENTRUSTMENT_STATUS_CHECK_REJECTED(-1, "审核被驳回"),		// 审核被驳回
//	ENTRUSTMENT_STATUS_APPROVE_REJECTED(-2, "审批被驳回"),		// 审批被驳回
	ENTRUST_STATUS_WAITING_CHECK_CLAIM(1, "待审核"),		// 已提交, 待审核人员认领审核任务
	ENTRUST_STATUS_WAITING_CHECK(2, "审核中"),				// 审核任务已认领, 审核中
	ENTRUST_STATUS_WAITING_APPROVE_CLAIM(3, "待审批"),   // 审核通过, 待审批人员认领审批任务
	ENTRUST_STATUS_WAITING_APPROVE(4, "审批中"),   // 审批任务已认领, 待审批
	ENTRUST_STATUS_WAITING_CONFIRM(5, "待送检确认"),   // 审批通过, 待送检确认
	ENTRUST_STATUS_WAITING_DELIVER(6, "送检确认通过, 待送检"),
	ENTRUST_STATUS_WAITING_ACCEPT(7, "待受理"),
	//ENTRUSTMENT_STATUS_ACCEPTING(8, "正在受理中"),           // 受理过程比较花时间
	ENTRUST_STATUS_ACCEPTED(9, "已受理, 进入检验环节"),

	ENTRUST_STATUS_TEST_FINISH(10, "检验完毕"),

	ENTRUST_STATUS_COMPLETED(99, "委托已完成"),    // 已受理, 已完成鉴定, 结束
	ENTRUST_STATUS_TERMINATED(98, "委托已终止"),   // 已受理, 无法完成鉴定, 结束
	ENTRUST_STATUS_ABORTED(97, "已中止");            // 在受理之前被中止

	// 以下状态信息需要确认
//	String ENTRUSTMENT_STATUS_IDENTIFYING = "检验中";
//	String ENTRUSTMENT_STATUS_IDENTIFIED = "已检验";
//	String ENTRUSTMENT_STATUS_ANALYSED = "已分析";
//	String ENTRUSTMENT_STATUS_WAITING_MARK_REPORT = "等制作文书";
//	String ENTRUST_STATUS_COMPLETED = "已完成";
//	String ENTRUSTMENT_STATUS_WAITING_REPLENISH_SAMPLES = "待补充样本";

	/**
	 * 流程中的位置
	 */
	private final int status;

	/**
	 * 描述
	 */
	private final String description;

	public static String getStatusDescription(Integer theStatus) {
		if (theStatus == null) {
			theStatus = 0;
		}
		for (EntrustStatusConstants st : EntrustStatusConstants.values()) {
			if (st.getStatus() == theStatus) {
				return st.description;
			}
		}
		return "";
	}

	public static int taskDefinitionKeyToStatus(String taskDefinitionKey) {
		if (StrUtil.isBlank(taskDefinitionKey)) {
			return -1;      // 空的 key
		}

		if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "entrustmentCreate")) {
			return ENTRUST_STATUS_CREATED.getStatus();
		}
		else if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "entrustmentCheck")) {
			return ENTRUST_STATUS_WAITING_CHECK_CLAIM.getStatus();
		}
		else if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "entrustmentApprove")) {
			return ENTRUST_STATUS_WAITING_APPROVE_CLAIM.getStatus();
		}
		else if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "deliverConfirm")) {
			return ENTRUST_STATUS_WAITING_CONFIRM.getStatus();
		}
		else if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "entrustmentWaitforDeliver")) {
			return ENTRUST_STATUS_WAITING_DELIVER.getStatus();
		}
		else if (StrUtil.equalsIgnoreCase(taskDefinitionKey, "entrustmentAccept")) {
			return ENTRUST_STATUS_WAITING_ACCEPT.getStatus();
		}
		else {
			return -1;
		}

	}

	public int getStatus() {
		return status;
	}


	/**
	 * 判断状态是否在已受理以及之后的状态, ge代表大于等于
	 *
	 * @param theStatus 待判断的状态码
	 * @return 如果状态码为已受理、检验完成 或 委托完成之一，则返回true；否则返回false
	 */
	// 判断状态是否在已受理以及之后的状态, ge代表大于等于
	public static boolean geAcceptedStatus(Integer theStatus) {
		if (theStatus == null) {
			return false;
		}
		if (theStatus.equals(ENTRUST_STATUS_ACCEPTED.getStatus()) || theStatus.equals(ENTRUST_STATUS_TEST_FINISH.getStatus()) || theStatus.equals(ENTRUST_STATUS_COMPLETED.getStatus())) {
			return true;
		}
		return false;
	}

}
