package com.gzzm.lobster.skill;

import net.cyan.thunwind.annotation.OQL;
import net.cyan.thunwind.dao.GeneralDao;

import java.util.List;

/**
 * SkillInvocationDao —— Skill 调用日志持久化 / Persistence for skill invocation telemetry.
 *
 * <p>写入热路径：{@code SkillTools.use} 每次调用一条；失败静默（telemetry 故障不挡主路径）。
 * 查询：后台页面按 skillId 聚合，或按 threadId 看本 thread 读过哪些 skill。
 */
public abstract class SkillInvocationDao extends GeneralDao {

    @OQL("select i from SkillInvocationLog i where i.skillId=?1 order by i.invokedAt desc limit ?2,?3")
    public abstract List<SkillInvocationLog> listBySkill(String skillId, int offset, int limit) throws Exception;

    @OQL("select count(i) from SkillInvocationLog i where i.skillId=?1")
    public abstract long countBySkill(String skillId) throws Exception;

    /**
     * 用参数绑定而非字面量 {@code duplicate=1}——thunwind 对布尔/枚举字面量
     * 在部分驱动下表现不稳（详见 feedback_thunwind_enum_ordinal），参数绑定最稳.
     */
    @OQL("select count(i) from SkillInvocationLog i where i.skillId=?1 and i.duplicate=?2")
    public abstract long countDuplicateBySkill(String skillId, Boolean duplicate) throws Exception;

    @OQL("select i from SkillInvocationLog i where i.threadId=?1 order by i.invokedAt asc")
    public abstract List<SkillInvocationLog> listByThread(String threadId) throws Exception;
}
