package tech.easyflow.chatlog.service.impl;

import org.springframework.stereotype.Service;
import tech.easyflow.chatlog.domain.dto.ChatActiveUserRank;
import tech.easyflow.chatlog.domain.dto.ChatAssistantSessionTrend;
import tech.easyflow.chatlog.domain.dto.ChatAssistantUsageRank;
import tech.easyflow.chatlog.domain.dto.ChatDashboardSummary;
import tech.easyflow.chatlog.domain.dto.ChatDashboardTrend;
import tech.easyflow.chatlog.repository.analyticaldb.ChatAnalyticalDBRepository;
import tech.easyflow.chatlog.service.ChatDashboardQueryService;

import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

/**
 * 基于分析库的聊天工作台统计查询实现。
 */
@Service
public class ChatDashboardQueryServiceImpl implements ChatDashboardQueryService {

    private final ChatAnalyticalDBRepository analyticalDBRepository;

    public ChatDashboardQueryServiceImpl(ChatAnalyticalDBRepository analyticalDBRepository) {
        this.analyticalDBRepository = analyticalDBRepository;
    }

    /**
     * 查询聊天汇总指标。
     *
     * @param startDate 开始日期，包含当天
     * @param endDate 结束日期，不包含当天
     * @param tenantId 租户 ID，空表示全局
     * @return 聊天汇总指标
     */
    @Override
    public ChatDashboardSummary querySummary(LocalDate startDate, LocalDate endDate, BigInteger tenantId) {
        if (!available()) {
            return ChatDashboardSummary.empty();
        }
        return analyticalDBRepository.queryDashboardSummary(startDate, endDate, tenantId);
    }

    /**
     * 查询聊天日趋势。
     *
     * @param startDate 开始日期，包含当天
     * @param endDate 结束日期，不包含当天
     * @param tenantId 租户 ID，空表示全局
     * @return 聊天日趋势
     */
    @Override
    public List<ChatDashboardTrend> queryTrends(LocalDate startDate, LocalDate endDate, BigInteger tenantId) {
        if (!available()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryDashboardTrends(startDate, endDate, tenantId);
    }

    /**
     * 查询聊天小时趋势。
     *
     * @param startTime 开始时间，包含
     * @param endTime 结束时间，不包含
     * @param tenantId 租户 ID，空表示全局
     * @return 聊天小时趋势
     */
    @Override
    public List<ChatDashboardTrend> queryHourlyTrends(LocalDateTime startTime, LocalDateTime endTime, BigInteger tenantId) {
        if (!available()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryDashboardHourlyTrends(startTime, endTime, tenantId);
    }

    /**
     * 查询智能体使用排行。
     *
     * @param startDate 开始日期，包含当天
     * @param endDate 结束日期，不包含当天
     * @param tenantId 租户 ID，空表示全局
     * @param limit 返回条数
     * @return 智能体使用排行
     */
    @Override
    public List<ChatAssistantUsageRank> queryAssistantUsageRanks(LocalDate startDate,
                                                                 LocalDate endDate,
                                                                 BigInteger tenantId,
                                                                 int limit) {
        if (!available()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryAssistantUsageRanks(startDate, endDate, tenantId, limit);
    }

    /**
     * 查询智能体日趋势。
     *
     * @param startDate 开始日期，包含当天
     * @param endDate 结束日期，不包含当天
     * @param tenantId 租户 ID，空表示全局
     * @param assistantIds 智能体 ID 列表
     * @return 智能体日趋势
     */
    @Override
    public List<ChatAssistantSessionTrend> queryAssistantTrends(LocalDate startDate,
                                                                LocalDate endDate,
                                                                BigInteger tenantId,
                                                                List<BigInteger> assistantIds) {
        if (!available() || assistantIds == null || assistantIds.isEmpty()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryAssistantSessionTrends(startDate, endDate, tenantId, assistantIds);
    }

    /**
     * 查询智能体小时趋势。
     *
     * @param startTime 开始时间，包含
     * @param endTime 结束时间，不包含
     * @param tenantId 租户 ID，空表示全局
     * @param assistantIds 智能体 ID 列表
     * @return 智能体小时趋势
     */
    @Override
    public List<ChatAssistantSessionTrend> queryAssistantHourlyTrends(LocalDateTime startTime,
                                                                      LocalDateTime endTime,
                                                                      BigInteger tenantId,
                                                                      List<BigInteger> assistantIds) {
        if (!available() || assistantIds == null || assistantIds.isEmpty()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryAssistantSessionHourlyTrends(startTime, endTime, tenantId, assistantIds);
    }

    /**
     * 查询活跃用户排行。
     *
     * @param startDate 开始日期，包含当天
     * @param endDate 结束日期，不包含当天
     * @param tenantId 租户 ID，空表示全局
     * @param assistantId 智能体 ID，空表示全部
     * @param limit 返回条数
     * @return 活跃用户排行
     */
    @Override
    public List<ChatActiveUserRank> queryActiveUserRanks(LocalDate startDate,
                                                         LocalDate endDate,
                                                         BigInteger tenantId,
                                                         BigInteger assistantId,
                                                         Integer limit) {
        if (!available()) {
            return Collections.emptyList();
        }
        return analyticalDBRepository.queryActiveUserRanks(startDate, endDate, tenantId, assistantId, limit);
    }

    /**
     * 当前分析库是否可用。
     *
     * @return true 表示可用
     */
    @Override
    public boolean available() {
        return analyticalDBRepository.enabled();
    }
}
