package com.ycwl.basic.enums;

/**
 * 视频任务状态枚举
 * 用于前端展示任务状态
 */
public enum VideoTaskStatus {

    /**
     * 无效人脸（景区级别）
     */
    INVALID_FACE_SCENIC(-2, "尚未录入有效人脸"),

    /**
     * 无效人脸（人脸级别）
     */
    INVALID_FACE(-1, "尚未录入有效人脸"),

    /**
     * 待制作
     * 人脸已录入，但尚未开始合成视频
     */
    PENDING(0, "专属视频待制作"),

    /**
     * 合成成功
     * 已为用户合成视频
     */
    SUCCESS(1, "AI已为您合成视频"),

    /**
     * 合成中
     * 正在合成专属视频
     */
    PROCESSING(2, "专属视频合成中"),

    /**
     * 合成失败
     */
    FAILED(3, "视频合成失败"),

    /**
     * 切片中
     * 正在检索新的视频片段
     */
    CUTTING(4, "正在检索新的视频片段");

    private final int code;
    private final String description;

    VideoTaskStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据code获取枚举
     */
    public static VideoTaskStatus fromCode(int code) {
        for (VideoTaskStatus status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("Unknown VideoTaskStatus code: " + code);
    }

    /**
     * 根据code获取枚举，如果不存在则返回默认值
     * @param code 状态码
     * @param defaultStatus 默认状态
     * @return 枚举值
     */
    public static VideoTaskStatus fromCodeOrDefault(int code, VideoTaskStatus defaultStatus) {
        for (VideoTaskStatus status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        return defaultStatus;
    }

    /**
     * 获取前端展示文案
     * @param count 已合成视频数量（仅SUCCESS状态使用）
     * @return 展示文案
     */
    public String getDisplayText(long count) {
        if (this == SUCCESS && count > 0) {
            return "AI已为您合成" + count + "个视频";
        }
        return description;
    }

    /**
     * 根据业务逻辑判断最终展示状态
     * @param taskStatus 任务状态码
     * @param cutStatus 切片状态码（来自FaceCutStatus）
     * @param count 已合成视频数量
     * @return 最终展示的状态
     */
    public static VideoTaskStatus resolveDisplayStatus(int taskStatus, int cutStatus, long count) {
        VideoTaskStatus status = fromCodeOrDefault(taskStatus, PENDING);

        // 优先级1: 无效人脸状态
        if (status == INVALID_FACE_SCENIC || status == INVALID_FACE) {
            return status;
        }

        // 优先级2: 切片状态优先（当任务状态为待制作且切片状态为正在切片时）
        if (status == PENDING && cutStatus == 0) {
            return CUTTING;
        }

        // 优先级3: 返回任务状态
        return status;
    }

    /**
     * 获取最终展示文案
     * @param taskStatus 任务状态码
     * @param cutStatus 切片状态码
     * @param count 已合成视频数量
     * @return 展示文案
     */
    public static String getDisplayText(int taskStatus, int cutStatus, long count) {
        VideoTaskStatus status = resolveDisplayStatus(taskStatus, cutStatus, count);
        return status.getDisplayText(count);
    }

    /**
     * 判断是否为成功状态
     */
    public boolean isSuccess() {
        return this == SUCCESS;
    }

    /**
     * 判断是否为处理中状态
     */
    public boolean isProcessing() {
        return this == PROCESSING || this == CUTTING;
    }

    /**
     * 判断是否为失败状态
     */
    public boolean isFailed() {
        return this == FAILED || this == INVALID_FACE || this == INVALID_FACE_SCENIC;
    }
}
