package com.easyagents.skill.model;

import com.easyagents.skill.util.SkillResources;

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 id;
    private String packageRoot;
    private String name;
    private String description;
    private SkillMetadata metadata = new SkillMetadata();
    private String skillContent;
    private SkillDocument document;
    private List<SkillResource> resources = new ArrayList<>();
    private boolean resourcesInitialized;
    private List<SkillReference> references = new ArrayList<>();
    private List<SkillScript> scripts = new ArrayList<>();
    private List<SkillAsset> assets = new ArrayList<>();

    /**
     * 获取 Skill ID。
     *
     * @return Skill ID
     */
    public String getId() {
        return id;
    }

    /**
     * 设置 Skill ID。
     *
     * @param id Skill ID
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取导入包中的顶层目录名；该值不是仓储 ID。
     *
     * @return 包目录名
     */
    public String getPackageRoot() {
        return packageRoot;
    }

    /**
     * 设置导入包中的顶层目录名。
     *
     * @param packageRoot 包目录名
     */
    public void setPackageRoot(String packageRoot) {
        this.packageRoot = packageRoot;
    }

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

    /**
     * 设置名称。
     *
     * @param name 名称
     */
    public void setName(String name) {
        this.name = name;
    }

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

    /**
     * 设置描述。
     *
     * @param description 描述
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * 获取元数据。
     *
     * @return 元数据
     */
    public SkillMetadata getMetadata() {
        return metadata;
    }

    /**
     * 设置元数据。
     *
     * @param metadata 元数据
     */
    public void setMetadata(SkillMetadata metadata) {
        this.metadata = metadata == null ? new SkillMetadata() : metadata;
    }

    /**
     * 获取 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();
        if (document != null) {
            java.util.Map<String, Object> values = document.getFrontmatter().getValues();
            this.metadata = new SkillMetadata(values);
            this.name = values.get("name") instanceof String text ? text : null;
            this.description = values.get("description") instanceof String text ? text : null;
        }
    }

    /**
     * 获取通用资源列表。
     *
     * @return 通用资源列表
     */
    public List<SkillResource> getResources() {
        if (!resourcesInitialized) {
            resources = resources == null || resources.isEmpty()
                    ? new ArrayList<>(SkillResources.fromLegacyViews(this))
                    : new ArrayList<>(resources);
            resourcesInitialized = true;
        }
        return resources;
    }

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

    /**
     * 判断正式通用资源列表是否已被显式初始化。
     *
     * <p>该标记用于区分“尚未迁移的旧资源视图”和“调用方明确设置的空资源列表”，
     * 避免删除最后一个正式资源后又从旧兼容视图恢复该资源。</p>
     *
     * @return 已显式设置通用资源列表时为 true
     */
    public boolean isResourcesInitialized() {
        return resourcesInitialized;
    }

    /**
     * 获取参考文档列表。
     *
     * @return 参考文档列表
     */
    public List<SkillReference> getReferences() {
        return references;
    }

    /**
     * 设置参考文档列表。
     *
     * @param references 参考文档列表
     */
    public void setReferences(List<SkillReference> references) {
        this.references = references == null ? new ArrayList<>() : new ArrayList<>(references);
    }

    /**
     * 获取脚本列表。
     *
     * @return 脚本列表
     */
    public List<SkillScript> getScripts() {
        return scripts;
    }

    /**
     * 设置脚本列表。
     *
     * @param scripts 脚本列表
     */
    public void setScripts(List<SkillScript> scripts) {
        this.scripts = scripts == null ? new ArrayList<>() : new ArrayList<>(scripts);
    }

    /**
     * 获取资产列表。
     *
     * @return 资产列表
     */
    public List<SkillAsset> getAssets() {
        return assets;
    }

    /**
     * 设置资产列表。
     *
     * @param assets 资产列表
     */
    public void setAssets(List<SkillAsset> assets) {
        this.assets = assets == null ? new ArrayList<>() : new ArrayList<>(assets);
    }

    /**
     * 转换为轻量描述。
     *
     * @return Skill 描述
     */
    public SkillDescriptor toDescriptor() {
        return new SkillDescriptor(id, name, description, metadata);
    }
}
