package com.aircraft.modules.order.domain.enums;

import com.aircraft.exception.BadRequestException;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 *
 * 订单任务状态枚举类
 *
 * @author chenxiky
 * @version 1.0.0
 * @since 2025/7/12
 */
@Getter
@AllArgsConstructor
public enum OrderTaskStatusEnum {

    /**
     * 未进行
     */
    NOT_STARTED(0, "未进行"),
    /**
     * 进行中
     */
    PROCESSING(1, "进行中"),
    /**
     * 已完成
     */
    COMPLETED(2, "已完成"),

    /**
     * 任务失败
     */
    FAILED(3, "任务失败");


    /**
     * code值
     */
    private final Integer code;

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

    /**
     * 根据code获取枚举
     *
     * @param code 编码
     * @return  {@link OrderTaskStatusEnum}
     */
    public static OrderTaskStatusEnum getInstance(Integer code) {

        return Arrays.stream(OrderTaskStatusEnum.values())
                .filter(o -> o.getCode().equals(code)).findFirst().orElse(null);
    }


    /**
     * 检测状态转换是否有效
     *
     * @param oldStatusCode  旧状态
     * @param changeStatusCode  将要改变的状态值
     * @return  boolean 返回异常信息  变更合法返回true,false 则无需处理状态变更
     */
    public static boolean checkStatusTransitionValid(Integer oldStatusCode, Integer changeStatusCode) {
        // 未发生变化直接返回
        if (oldStatusCode.equals(changeStatusCode)){
            return false;
        }
        if (COMPLETED.code.equals(oldStatusCode) || FAILED.code.equals(oldStatusCode)) {
            // 获取对应的值返回错误信息
            OrderTaskStatusEnum oldStatus = OrderTaskStatusEnum.getInstance(oldStatusCode);
            String msg = String.format("订单任务状态不能进行状态变更,当前状态为:%s", oldStatus.getDescription());
            throw new BadRequestException(msg);
        }
        // 订单状态变更要大于本身的值，否则不允许修改，提示相关错误信息
        if (changeStatusCode < oldStatusCode) {
            // 当前状态是什么，不允许变更为什么
            OrderTaskStatusEnum changeStatus = OrderTaskStatusEnum.getInstance(changeStatusCode);
            OrderTaskStatusEnum oldStatus = OrderTaskStatusEnum.getInstance(oldStatusCode);
            String msg = String.format("订单任务状态不能进行状态变更,当前状态为:%s,不允许修改为:%s", oldStatus.getDescription(), changeStatus.getDescription());
            throw new BadRequestException(msg);
        }
        return true;
    }
}
