package com.easyagents.scheduler;

import java.util.Objects;

/**
 * 调度底座异常，携带稳定错误码供调用方分类处理。
 */
public class ScheduleException extends RuntimeException {

    /** 稳定错误码。 */
    private final ScheduleErrorCode errorCode;

    /**
     * 创建调度异常。
     *
     * @param errorCode 稳定错误码
     * @param message 非空错误说明
     */
    public ScheduleException(ScheduleErrorCode errorCode, String message) {
        super(requireMessage(message));
        this.errorCode = Objects.requireNonNull(errorCode, "errorCode must not be null");
    }

    /**
     * 创建带原始原因的调度异常。
     *
     * @param errorCode 稳定错误码
     * @param message 非空错误说明
     * @param cause 原始异常
     */
    public ScheduleException(ScheduleErrorCode errorCode, String message, Throwable cause) {
        super(requireMessage(message), cause);
        this.errorCode = Objects.requireNonNull(errorCode, "errorCode must not be null");
    }

    /**
     * 返回稳定错误码。
     *
     * @return 错误码
     */
    public ScheduleErrorCode errorCode() {
        return errorCode;
    }

    /**
     * 校验异常消息。
     *
     * @param message 原始消息
     * @return 非空消息
     */
    private static String requireMessage(String message) {
        if (message == null || message.isBlank()) {
            throw new IllegalArgumentException("message must not be blank");
        }
        return message;
    }
}
