package com.easyagents.skill.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Skill 聚合根。
 */
public class Skill implements Serializable {

    private static final long serialVersionUID = 1L;

    private String packageRoot;
    private String skillContent;
    private SkillDocument document;
    private List<SkillResource> resources = new ArrayList<>();

    /**
     * 获取 Skill 自身的逻辑目录名；导入包允许在其外再包装一层父目录。
     *
     * @return 包目录名
     */
    public String getPackageRoot() {
        return packageRoot;
    }

    /**
     * 设置 Skill 自身的逻辑目录名。
     *
     * @param packageRoot 包目录名
     */
    public void setPackageRoot(String packageRoot) {
        this.packageRoot = packageRoot;
    }

    /**
     * 获取名称。
     *
     * @return 名称
     */
    public String getName() {
        return frontmatterString("name");
    }

    /**
     * 获取描述。
     *
     * @return 描述
     */
    public String getDescription() {
        return frontmatterString("description");
    }

    /**
     * 获取 SKILL.md 原始内容。
     *
     * @return SKILL.md 原始内容
     */
    public String getSkillContent() {
        return document == null ? skillContent : document.render();
    }

    /**
     * 设置 SKILL.md 原始内容。
     *
     * @param skillContent SKILL.md 原始内容
     */
    public void setSkillContent(String skillContent) {
        this.skillContent = skillContent;
        this.document = null;
    }

    /**
     * 获取解析后的 SKILL.md 文档。
     *
     * @return 解析后的文档
     */
    public SkillDocument getDocument() {
        return document;
    }

    /**
     * 设置解析后的 SKILL.md 文档。
     *
     * @param document 解析后的文档
     */
    public void setDocument(SkillDocument document) {
        this.document = document;
        this.skillContent = document == null ? null : document.render();
    }

    /**
     * 获取通用资源列表。
     *
     * @return 通用资源列表
     */
    public List<SkillResource> getResources() {
        return resources;
    }

    /**
     * 设置通用资源列表。
     *
     * @param resources 通用资源列表
     */
    public void setResources(List<SkillResource> resources) {
        this.resources = resources == null ? new ArrayList<>() : new ArrayList<>(resources);
    }

    private String frontmatterString(String key) {
        if (document == null) {
            return null;
        }
        Object value = document.getFrontmatter().get(key);
        return value instanceof String text ? text : null;
    }
}
