package com.gzzm.lobster.skill;

import com.gzzm.lobster.common.SkillRuntimeKind;
import com.gzzm.lobster.common.SkillScope;
import net.cyan.thunwind.annotation.ColumnDescription;
import net.cyan.thunwind.annotation.Entity;
import net.cyan.thunwind.annotation.Index;

import java.util.Date;

/**
 * SkillDefinition —— 技能定义 / Skill definition.
 *
 * <p>Skill 是文档（LLM 方法模板），不是工作流脚本。
 * <br>
 * Skill is a document — the LLM's method template, not a workflow script.
 */
@Entity(table = "AI_SKILL_DEFINITION", keys = "skillId")
public class SkillDefinition {

    @ColumnDescription(type = "varchar(60)")
    private String skillId;

    @ColumnDescription(type = "varchar(200)", nullable = false)
    private String name;

    private SkillScope scope;

    @ColumnDescription(type = "varchar(40)")
    private String orgId;

    /**
     * 创建者 userId / Creator user id.
     *
     * <p>null = 由 admin 创建的公共 skill（system / org 共享）；
     * 非 null = 用户在 {@code UserSkillApi} 创建的个人 skill，只有该用户能改/删.
     * 运行期可见性仍按 scope 控制（个人 skill 默认 scope=org，orgId 绑创建者 org）.
     */
    @ColumnDescription(type = "varchar(40)")
    private String ownerUserId;

    /**
     * 给模型看的"什么时候该用这个 skill"——语义对齐 Claude Code 的
     * {@code SKILL.md.frontmatter.description}。建议：触发关键词前置、场景要具体、
     * 可写明 "do NOT use when ..."。
     *
     * <p>从 500 扩到 2000：Claude Code 上限 1536，我们留一点余量。已有线上数据不会
     * 自动 ALTER，升级时执行：
     * <pre>{@code ALTER TABLE AI_SKILL_DEFINITION MODIFY COLUMN TRIGGERCONDITION VARCHAR(2000);}</pre>
     */
    @ColumnDescription(type = "varchar(2000)")
    private String triggerCondition;

    /** LLM 可读正文（markdown）/ Full guidance body (markdown) */
    @ColumnDescription(type = "blob")
    private String guidance;

    private SkillRuntimeKind runtimeKind;

    /** intermediate_states (JSON array) */
    @ColumnDescription(type = "varchar(600)")
    private String intermediateStatesJson;

    /** query_scopes (JSON array) */
    @ColumnDescription(type = "varchar(600)")
    private String queryScopesJson;

    /** resume_checks (JSON array) */
    @ColumnDescription(type = "varchar(1000)")
    private String resumeChecksJson;

    /** completion_requirements (JSON array) */
    @ColumnDescription(type = "varchar(1000)")
    private String completionRequirementsJson;

    @ColumnDescription(type = "number(6)", defaultValue = "1")
    private Integer version;

    @ColumnDescription(type = "number(1)", defaultValue = "1")
    private Boolean enabled;

    /**
     * ContentStore 路径：指向 skill 资产包（tar.gz），内含 SKILL.md 以及可选 scripts/、templates/、字体等资源.
     * null 表示该 skill 没有可执行资产包，仍然可以纯作为 guidance 工作.
     */
    @ColumnDescription(type = "varchar(200)")
    private String assetBundleRef;

    /**
     * JSON 数组：该 skill 需要的 pip 包清单.
     * P0 必须是沙箱镜像预装的子集，否则 bundle 上传会被 AdminSkillBundleApi 拒绝.
     */
    @ColumnDescription(type = "varchar(600)")
    private String pythonPackagesJson;

    private Date createTime;
    private Date updateTime;

    public SkillDefinition() {}

    public String getSkillId() { return skillId; }
    public void setSkillId(String skillId) { this.skillId = skillId; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public SkillScope getScope() { return scope; }
    public void setScope(SkillScope scope) { this.scope = scope; }
    public String getOrgId() { return orgId; }
    public void setOrgId(String orgId) { this.orgId = orgId; }
    public String getOwnerUserId() { return ownerUserId; }
    public void setOwnerUserId(String ownerUserId) { this.ownerUserId = ownerUserId; }
    public String getTriggerCondition() { return triggerCondition; }
    public void setTriggerCondition(String triggerCondition) { this.triggerCondition = triggerCondition; }
    public String getGuidance() { return guidance; }
    public void setGuidance(String guidance) { this.guidance = guidance; }
    public SkillRuntimeKind getRuntimeKind() { return runtimeKind; }
    public void setRuntimeKind(SkillRuntimeKind runtimeKind) { this.runtimeKind = runtimeKind; }
    public String getIntermediateStatesJson() { return intermediateStatesJson; }
    public void setIntermediateStatesJson(String intermediateStatesJson) { this.intermediateStatesJson = intermediateStatesJson; }
    public String getQueryScopesJson() { return queryScopesJson; }
    public void setQueryScopesJson(String queryScopesJson) { this.queryScopesJson = queryScopesJson; }
    public String getResumeChecksJson() { return resumeChecksJson; }
    public void setResumeChecksJson(String resumeChecksJson) { this.resumeChecksJson = resumeChecksJson; }
    public String getCompletionRequirementsJson() { return completionRequirementsJson; }
    public void setCompletionRequirementsJson(String completionRequirementsJson) { this.completionRequirementsJson = completionRequirementsJson; }
    public Integer getVersion() { return version; }
    public void setVersion(Integer version) { this.version = version; }
    public Boolean getEnabled() { return enabled; }
    public void setEnabled(Boolean enabled) { this.enabled = enabled; }
    public String getAssetBundleRef() { return assetBundleRef; }
    public void setAssetBundleRef(String assetBundleRef) { this.assetBundleRef = assetBundleRef; }
    public String getPythonPackagesJson() { return pythonPackagesJson; }
    public void setPythonPackagesJson(String pythonPackagesJson) { this.pythonPackagesJson = pythonPackagesJson; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
    public Date getUpdateTime() { return updateTime; }
    public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
}
