package com.gzzm.lobster.context;

import net.cyan.thunwind.annotation.ColumnDescription;
import net.cyan.thunwind.annotation.Entity;
import net.cyan.thunwind.annotation.Index;

import java.util.Date;

/**
 * CompactionEvent —— 历史摘要审计 / Compaction event audit row.
 *
 * <p>每次 LLM 摘要成功落地一条记录。同时是 {@link LlmSummarizer} 的幂等缓存索引：
 * 给定 {@code (threadId, keyHash)} 查得 {@code summaryRef} 即可从 ContentStore
 * 取出之前生成的摘要文本，避免对同一段历史重复调 LLM。
 *
 * <p>可审计：用户怀疑摘要漏关键信息时，可按 {@code threadId} 列出所有压缩事件、
 * 按 {@code summaryRef} 拉原文核对、按 {@code modelProfileId} 对比不同模型的摘要质量。
 */
@Entity(table = "AI_COMPACTION_EVENT", keys = "eventId")
public class CompactionEvent {

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

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

    /**
     * sha256(threadId + 顺序拼接的消息 role/content/toolCallId).
     * (threadId, keyHash) 是幂等键；同一段历史在同一 thread 内只摘要一次。
     */
    @Index
    @ColumnDescription(type = "varchar(64)", nullable = false)
    private String keyHash;

    /** ContentStore ref，指向摘要文本（不含 "## 历史摘要..." 前缀）. */
    @ColumnDescription(type = "varchar(400)", nullable = false)
    private String summaryRef;

    /** 实际使用的 modelId（可能是 summarizerModelId 也可能是主路由 fallback 后的模型）. */
    @ColumnDescription(type = "varchar(40)")
    private String modelProfileId;

    /** 折叠区消息条数；用于审计/可观测. */
    @ColumnDescription(type = "number(8)")
    private Integer messageCount;

    private Date createTime;

    public String getEventId() { return eventId; }
    public void setEventId(String eventId) { this.eventId = eventId; }
    public String getThreadId() { return threadId; }
    public void setThreadId(String threadId) { this.threadId = threadId; }
    public String getKeyHash() { return keyHash; }
    public void setKeyHash(String keyHash) { this.keyHash = keyHash; }
    public String getSummaryRef() { return summaryRef; }
    public void setSummaryRef(String summaryRef) { this.summaryRef = summaryRef; }
    public String getModelProfileId() { return modelProfileId; }
    public void setModelProfileId(String modelProfileId) { this.modelProfileId = modelProfileId; }
    public Integer getMessageCount() { return messageCount; }
    public void setMessageCount(Integer messageCount) { this.messageCount = messageCount; }
    public Date getCreateTime() { return createTime; }
    public void setCreateTime(Date createTime) { this.createTime = createTime; }
}
