package tech.easyflow.chatlog.service;

import tech.easyflow.chatlog.domain.dto.ChatHistoryPage;
import tech.easyflow.chatlog.domain.dto.ChatMessageRecord;
import tech.easyflow.chatlog.domain.dto.ChatSessionPage;
import tech.easyflow.chatlog.domain.dto.ChatSessionSummary;
import tech.easyflow.chatlog.domain.query.ChatPageQuery;
import tech.easyflow.chatlog.domain.query.ChatSessionFilterQuery;

import java.math.BigInteger;
import java.util.List;

/**
 * Agent 聊天历史管理服务。
 */
public interface ChatHistoryManageService {

    ChatSessionPage queryUserSessions(BigInteger userId, BigInteger assistantId, ChatPageQuery query);

    /**
     * 按当前管理端账号的数据范围查询 Agent 会话。
     *
     * @param requesterId 当前账号 ID
     * @param superAdmin 当前账号是否为超级管理员
     * @param query 会话筛选条件
     * @return 会话分页结果
     */
    ChatSessionPage queryAdminSessions(BigInteger requesterId,
                                       boolean superAdmin,
                                       ChatSessionFilterQuery query);

    ChatSessionSummary getUserSession(BigInteger userId, BigInteger sessionId);

    /**
     * 获取当前管理端账号可见的 Agent 会话。
     *
     * @param requesterId 当前账号 ID
     * @param superAdmin 当前账号是否为超级管理员
     * @param sessionId 会话 ID
     * @return 会话摘要
     */
    ChatSessionSummary getAdminSession(BigInteger requesterId,
                                       boolean superAdmin,
                                       BigInteger sessionId);

    ChatHistoryPage queryUserMessages(BigInteger userId, BigInteger sessionId, ChatPageQuery query);

    /**
     * 查询当前管理端账号可见会话的消息。
     *
     * @param requesterId 当前账号 ID
     * @param superAdmin 当前账号是否为超级管理员
     * @param sessionId 会话 ID
     * @param query 消息分页条件
     * @return 消息分页结果
     */
    ChatHistoryPage queryAdminMessages(BigInteger requesterId,
                                       boolean superAdmin,
                                       BigInteger sessionId,
                                       ChatPageQuery query);

    void renameUserSession(BigInteger userId, BigInteger sessionId, String title, BigInteger operatorId);

    void deleteUserSession(BigInteger userId, BigInteger sessionId, BigInteger operatorId);

    List<ChatMessageRecord> listUserRoundVariants(BigInteger userId, BigInteger sessionId, BigInteger roundId);

    ChatMessageRecord selectUserRoundVariant(BigInteger userId, BigInteger sessionId, BigInteger roundId, Integer variantIndex, BigInteger operatorId);

    /**
     * 查询当前管理端账号可见会话的答案版本。
     *
     * @param requesterId 当前账号 ID
     * @param superAdmin 当前账号是否为超级管理员
     * @param sessionId 会话 ID
     * @param roundId 对话轮次 ID
     * @return 答案版本列表
     */
    List<ChatMessageRecord> listAdminRoundVariants(BigInteger requesterId,
                                                   boolean superAdmin,
                                                   BigInteger sessionId,
                                                   BigInteger roundId);

    /**
     * 选择当前管理端账号可见会话的答案版本。
     *
     * @param requesterId 当前账号 ID，同时作为操作人 ID
     * @param superAdmin 当前账号是否为超级管理员
     * @param sessionId 会话 ID
     * @param roundId 对话轮次 ID
     * @param variantIndex 目标版本索引
     * @return 选中的答案记录
     */
    ChatMessageRecord selectAdminRoundVariant(BigInteger requesterId,
                                              boolean superAdmin,
                                              BigInteger sessionId,
                                              BigInteger roundId,
                                              Integer variantIndex);
}
