package com.easyagents.skill.factory;

import com.easyagents.skill.model.*;
import com.easyagents.skill.util.SkillFrontmatter;
import com.easyagents.skill.util.SkillResources;
import com.easyagents.skill.validation.defaults.DefaultSkillValidator;

import java.util.List;
import java.util.Map;

/**
 * Skill 标准构建入口。
 */
public final class SkillFactory {

    private SkillFactory() {
    }

    /**
     * 基于 SKILL.md 内容创建 Skill。
     *
     * @param id Skill ID
     * @param skillContent SKILL.md 原始内容
     * @return Skill 聚合
     */
    public static Skill create(String id, String skillContent) {
        return create(id, skillContent, null, null, null);
    }

    /**
     * 基于 SKILL.md 内容创建并严格校验正式标准 Skill。
     *
     * @param id Skill ID
     * @param skillContent SKILL.md 原始内容
     * @return 通过正式标准校验的 Skill 聚合
     */
    public static Skill createStrict(String id, String skillContent) {
        Skill skill = create(id, skillContent);
        new DefaultSkillValidator().validate(skill);
        return skill;
    }

    /**
     * 基于 SKILL.md 内容和通用资源创建 Skill。
     *
     * @param id 仓储 ID，可为空
     * @param skillContent SKILL.md 原始内容
     * @param resources 通用资源列表
     * @return Skill 聚合
     */
    public static Skill createWithResources(String id, String skillContent, List<SkillResource> resources) {
        Skill skill = create(id, skillContent);
        skill.setResources(resources);
        SkillResources.refreshLegacyViews(skill);
        return skill;
    }

    /**
     * 基于 SKILL.md 和通用资源创建并严格校验正式标准 Skill。
     *
     * @param id 仓储 ID，可为空
     * @param skillContent SKILL.md 原始内容
     * @param resources 通用资源列表
     * @return 通过正式标准校验的 Skill 聚合
     */
    public static Skill createWithResourcesStrict(String id, String skillContent,
                                                  List<SkillResource> resources) {
        Skill skill = createWithResources(id, skillContent, resources);
        new DefaultSkillValidator().validate(skill);
        return skill;
    }

    /**
     * 基于 SKILL.md 内容和资源列表创建 Skill。
     *
     * @param id Skill ID
     * @param skillContent SKILL.md 原始内容
     * @param references reference 文档列表
     * @param scripts script 脚本列表
     * @param assets asset 资产列表
     * @return Skill 聚合
     */
    public static Skill create(String id, String skillContent, List<SkillReference> references,
                               List<SkillScript> scripts, List<SkillAsset> assets) {
        SkillDocument document = SkillFrontmatter.parseDocument(skillContent);
        Map<String, Object> values = document.getFrontmatter().getValues();
        String name = requiredScalar(values, "name");
        String description = requiredScalar(values, "description");
        Skill skill = new Skill();
        skill.setId(id);
        skill.setName(name);
        skill.setDescription(description);
        skill.setMetadata(new SkillMetadata(values));
        skill.setDocument(document);
        skill.setReferences(references);
        skill.setScripts(scripts);
        skill.setAssets(assets);
        skill.setResources(SkillResources.canonicalResources(skill));
        return skill;
    }

    private static String requiredScalar(Map<String, Object> values, String key) {
        Object value = values.get(key);
        if (!(value instanceof String text) || text.isBlank()) {
            throw new com.easyagents.skill.exception.SkillValidationException(
                    "SKILL.md frontmatter " + key + " must be a non-blank string.");
        }
        return text;
    }
}
