package com.easyagents.skill.validation;

import com.easyagents.skill.exception.SkillValidationException;
import com.easyagents.skill.model.Skill;
import com.easyagents.skill.model.SkillPackageLimits;

/**
 * Skill 校验接口。
 */
public interface SkillValidator {

    /**
     * 校验 Skill 聚合。
     *
     * @param skill Skill 聚合
     */
    void validate(Skill skill);

    /**
     * 聚合校验 Skill 并返回结构化报告。
     *
     * <p>兼容默认实现会把旧命令式异常转换为单个错误；新实现应覆盖以返回全部问题。</p>
     *
     * @param skill Skill 聚合
     * @return 结构化校验报告
     */
    default SkillValidationReport validateReport(Skill skill) {
        SkillValidationReport report = new SkillValidationReport();
        try {
            validate(skill);
        } catch (SkillValidationException e) {
            report.add(new SkillValidationIssue(e.getCode(), SkillValidationSeverity.ERROR, e.getPath(),
                    e.getLine(), e.getColumn(), e.getMessage(), null));
        }
        return report;
    }

    /**
     * 使用当前 Codec 操作的安全限额聚合校验 Skill。
     *
     * <p>兼容实现默认委托给原有校验入口；需要检查包限额的实现应覆盖本方法。</p>
     *
     * @param skill Skill 聚合
     * @param limits 当前读写操作的安全限额
     * @return 结构化校验报告
     */
    default SkillValidationReport validateReport(Skill skill, SkillPackageLimits limits) {
        return validateReport(skill);
    }

    /**
     * 使用指定标准模式和当前 Codec 安全限额聚合校验 Skill。
     *
     * <p>兼容实现默认忽略模式；需要区分草稿导入与正式标准约束的实现应覆盖本方法。</p>
     *
     * @param skill Skill 聚合
     * @param limits 当前读写操作的安全限额
     * @param mode 标准校验模式
     * @return 结构化校验报告
     */
    default SkillValidationReport validateReport(Skill skill, SkillPackageLimits limits,
                                                 SkillValidationMode mode) {
        return validateReport(skill, limits);
    }
}
