package com.easyagents.skill.exception;

import com.easyagents.skill.validation.SkillValidationReport;

/**
 * Skill 包导入导出异常。
 */
public class SkillPackageException extends SkillException {

    private final String code;
    private final String path;
    private final SkillValidationReport report;

    /**
     * 创建 Skill 包异常。
     *
     * @param message 异常信息
     */
    public SkillPackageException(String message) {
        this("SKILL_PACKAGE_FAILED", null, message, null, null);
    }

    /**
     * 创建 Skill 包异常。
     *
     * @param message 异常信息
     * @param cause 原始异常
     */
    public SkillPackageException(String message, Throwable cause) {
        this("SKILL_PACKAGE_FAILED", null, message, cause, null);
    }

    /**
     * 创建可定位的 Skill 包异常。
     *
     * @param code 稳定错误码
     * @param path 包内路径
     * @param message 异常信息
     */
    public SkillPackageException(String code, String path, String message) {
        this(code, path, message, null, null);
    }

    /**
     * 创建包含根因的可定位 Skill 包异常。
     *
     * @param code 稳定错误码
     * @param path 包内路径
     * @param message 异常信息
     * @param cause 原始异常
     */
    public SkillPackageException(String code, String path, String message, Throwable cause) {
        this(code, path, message, cause, null);
    }

    /**
     * 创建包含结构化校验报告的 Skill 包异常。
     *
     * @param message 异常信息
     * @param report 结构化校验报告
     */
    public SkillPackageException(String message, SkillValidationReport report) {
        this("SKILL_PACKAGE_INVALID", null, message, null, report);
    }

    private SkillPackageException(String code, String path, String message,
                                  Throwable cause, SkillValidationReport report) {
        super(message, cause);
        this.code = code;
        this.path = path;
        this.report = report;
    }

    /** @return 稳定错误码 */
    public String getCode() {
        return code;
    }

    /** @return 包内路径 */
    public String getPath() {
        return path;
    }

    /** @return 结构化校验报告 */
    public SkillValidationReport getReport() {
        return report;
    }
}
