package com.gzzm.lobster.skill;

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

import java.util.Date;

/**
 * SkillInvocationLog —— Skill 调用审计日志 / Audit log of skill invocations.
 *
 * <p>每次 {@code use_skill} 工具调用落一条；用于：
 * <ul>
 *   <li>统计：哪些 skill 常用、冷门 skill 能否下线</li>
 *   <li>调试：同一 thread 重复读同一 skill 说明 SKILL.md 结构不清晰</li>
 *   <li>质量反馈：对比 description 与实际调用语境，判断 description 写得好不好</li>
 * </ul>
 *
 * <p>字段轻量——不记 guidance 内容/参数/结果；要溯源完整 LLM 上下文查 ModelCallLog.trace.
 */
@Entity(table = "AI_SKILL_INVOCATION", keys = "invocationId")
public class SkillInvocationLog {

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

    @Index
    @ColumnDescription(type = "varchar(60)", nullable = false)
    private String skillId;

    @Index
    @ColumnDescription(type = "varchar(40)", nullable = false)
    private String threadId;

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

    @ColumnDescription(type = "varchar(80)")
    private String runId;

    /** true = 本 thread 非首次读该 skill（幂等分支），有助于识别 SKILL.md 可读性问题. */
    @ColumnDescription(type = "number(1)", defaultValue = "0")
    private Boolean duplicate;

    @Index
    private Date invokedAt;

    public SkillInvocationLog() {
        this.invocationId = IdGenerator.prefixed("skinv_");
    }

    public String getInvocationId() { return invocationId; }
    public void setInvocationId(String invocationId) { this.invocationId = invocationId; }
    public String getSkillId() { return skillId; }
    public void setSkillId(String skillId) { this.skillId = skillId; }
    public String getThreadId() { return threadId; }
    public void setThreadId(String threadId) { this.threadId = threadId; }
    public String getUserId() { return userId; }
    public void setUserId(String userId) { this.userId = userId; }
    public String getRunId() { return runId; }
    public void setRunId(String runId) { this.runId = runId; }
    public Boolean getDuplicate() { return duplicate; }
    public void setDuplicate(Boolean duplicate) { this.duplicate = duplicate; }
    public Date getInvokedAt() { return invokedAt; }
    public void setInvokedAt(Date invokedAt) { this.invokedAt = invokedAt; }
}
