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 java.math.BigInteger;
import java.util.List;

public interface ChatSessionQueryService {

    List<ChatSessionSummary> listSessions(BigInteger userId, BigInteger assistantId, ChatPageQuery query);

    /**
     * 按助手编码查询用户会话列表。
     *
     * @param userId 用户 ID
     * @param assistantId 助手 ID，可为空
     * @param assistantCode 助手编码，可为空
     * @param query 分页参数
     * @return 会话列表
     */
    default List<ChatSessionSummary> listSessions(BigInteger userId, BigInteger assistantId, String assistantCode, ChatPageQuery query) {
        if (assistantCode != null && !assistantCode.isBlank()) {
            throw new UnsupportedOperationException("当前会话查询实现不支持 assistantCode 过滤");
        }
        return listSessions(userId, assistantId, query);
    }

    long countSessions(BigInteger userId, BigInteger assistantId);

    /**
     * 按助手编码统计用户会话数。
     *
     * @param userId 用户 ID
     * @param assistantId 助手 ID，可为空
     * @param assistantCode 助手编码，可为空
     * @return 会话数
     */
    default long countSessions(BigInteger userId, BigInteger assistantId, String assistantCode) {
        if (assistantCode != null && !assistantCode.isBlank()) {
            throw new UnsupportedOperationException("当前会话查询实现不支持 assistantCode 过滤");
        }
        return countSessions(userId, assistantId);
    }

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

    /**
     * 按助手编码分页查询用户会话。
     *
     * @param userId 用户 ID
     * @param assistantId 助手 ID，可为空
     * @param assistantCode 助手编码，可为空
     * @param query 分页参数
     * @return 会话分页
     */
    default ChatSessionPage pageSessions(BigInteger userId, BigInteger assistantId, String assistantCode, ChatPageQuery query) {
        if (assistantCode != null && !assistantCode.isBlank()) {
            throw new UnsupportedOperationException("当前会话查询实现不支持 assistantCode 过滤");
        }
        return pageSessions(userId, assistantId, query);
    }

    ChatSessionSummary getSessionSummary(BigInteger sessionId);

    /**
     * 分页查询当前会话的主线可见消息。
     *
     * @param sessionId 会话 ID
     * @param query 分页参数
     * @return 主线消息分页
     */
    ChatHistoryPage pageMainlineMessages(BigInteger sessionId, ChatPageQuery query);

    /**
     * 查询当前会话的全部主线可见消息。
     *
     * @param sessionId 会话 ID
     * @return 主线消息列表
     */
    List<ChatMessageRecord> listMainlineMessages(BigInteger sessionId);

    List<ChatMessageRecord> getRecentTail(BigInteger sessionId, int limit);
}
