package com.easyagents.skill.exception;

import com.easyagents.skill.validation.SkillValidationReport;

/**
 * Skill 校验失败异常。
 */
public class SkillValidationException extends SkillException {

    private final String code;
    private final String path;
    private final Integer line;
    private final Integer column;
    private final SkillValidationReport report;

    /**
     * 创建 Skill 校验异常。
     *
     * @param message 异常信息
     */
    public SkillValidationException(String message) {
        this("SKILL_VALIDATION_FAILED", null, null, null, message, null, null);
    }

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

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

    /**
     * 创建可定位的 Skill 校验异常。
     *
     * @param code 稳定错误码
     * @param path 文件路径
     * @param line 一基行号
     * @param column 一基列号
     * @param message 异常信息
     * @param cause 原始异常
     */
    public SkillValidationException(String code, String path, Integer line, Integer column,
                                    String message, Throwable cause) {
        this(code, path, line, column, message, cause, null);
    }

    /**
     * 创建同时携带定位、根因和完整报告的 Skill 校验异常。
     *
     * @param code 稳定错误码
     * @param path 文件路径
     * @param line 一基行号
     * @param column 一基列号
     * @param message 异常信息
     * @param cause 原始异常
     * @param report 完整结构化校验报告
     */
    public SkillValidationException(String code, String path, Integer line, Integer column,
                                    String message, Throwable cause, SkillValidationReport report) {
        super(message, cause);
        this.code = code;
        this.path = path;
        this.line = line;
        this.column = column;
        this.report = report;
    }

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

    /** @return 文件路径 */
    public String getPath() {
        return path;
    }

    /** @return 一基行号 */
    public Integer getLine() {
        return line;
    }

    /** @return 一基列号 */
    public Integer getColumn() {
        return column;
    }

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