package com.sundot.airport.exam.service;

import com.sundot.airport.common.core.domain.BaseLargeScreenQueryParamDto;
import com.sundot.airport.common.core.domain.DailyTaskAccuracyRankingDto;
import com.sundot.airport.common.dto.QuizAccuracyAnalysisResultDto;
import com.sundot.airport.exam.dto.AccuracyAggregateStatisticsDTO;
import com.sundot.airport.exam.dto.AccuracyStatisticsDTO;
import com.sundot.airport.exam.dto.AccuracyStatisticsQueryDTO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <b>功能名：</b>IAccuracyStatisticsService<br>
 * <b>说明：</b> 抽问抽答正确率统计Service接口 <br>
 * <b>著作权：</b> Copyright (C) 2026 SUNDOT CORPORATION<br>
 *
 * @author Simon Lin
 */
public interface IAccuracyStatisticsService {

    /**
     * 获取当前用户或部门的正确率统计
     *
     * @param query 查询参数
     * @return 正确率统计结果
     */
    AccuracyStatisticsDTO getAccuracyStatistics(AccuracyStatisticsQueryDTO query);

    /**
     * 获取指定用户的正确率统计
     *
     * @param userId 用户ID
     * @param query  查询参数
     * @return 正确率统计结果
     */
    AccuracyStatisticsDTO getUserAccuracyStatistics(Long userId, AccuracyStatisticsQueryDTO query);

    /**
     * 获取聚合统计数据
     *
     * @param query 查询参数
     * @return 聚合统计结果
     */
    AccuracyAggregateStatisticsDTO getAggregateStatistics(AccuracyStatisticsQueryDTO query);

    /**
     * 获取首页正确率排名
     *
     * @param dto 大屏查询参数
     * @return 排名DTO
     */
    DailyTaskAccuracyRankingDto getAccuracyRanking(BaseLargeScreenQueryParamDto dto);

    /**
     * 获取用户/部门正确率（用于能力对比）
     *
     * @param userId    用户ID（用户维度时使用）
     * @param deptId    部门ID（部门维度时使用）
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 正确率（0-1之间的小数）
     */
    BigDecimal getAccuracyRate(Long userId, Long deptId, java.util.Date startDate, java.util.Date endDate);

    /**
     * 首页报表-抽问抽答正确率数据
     *
     * @param dto 大屏查询参数
     * @return 首页报表-抽问抽答正确率数据
     */
    com.sundot.airport.common.core.domain.SysHomeReportDetailDto answerData(BaseLargeScreenQueryParamDto dto);

    /**
     * 初始化部门缓存（批量调用 answerData 前调用，避免重复查询数据库）
     */
    void initDeptCache();

    /**
     * 清理部门缓存
     */
    void clearDeptCache();

    /**
     * 批量获取多个用户的抽问抽答正确率
     *
     * @param userIds   用户ID列表
     * @param startDate 开始日期（yyyy-MM-dd）
     * @param endDate   结束日期（yyyy-MM-dd）
     * @return userId -> 正确率（百分制，如 85.50）
     */
    Map<Long, BigDecimal> getUsersAccuracyMap(List<Long> userIds, String startDate, String endDate);

    /**
     * 批量获取多个班组的抽问抽答正确率
     *
     * @param teamIds   班组ID列表
     * @param startDate 开始日期（yyyy-MM-dd）
     * @param endDate   结束日期（yyyy-MM-dd）
     * @return teamId -> 正确率（百分制，如 85.50）
     */
    Map<Long, BigDecimal> getTeamsAccuracyMap(List<Long> teamIds, String startDate, String endDate);

    /**
     * 批量获取多个部门的抽问抽答正确率
     *
     * @param deptIds   科室ID列表
     * @param startDate 开始日期（yyyy-MM-dd）
     * @param endDate   结束日期（yyyy-MM-dd）
     * @return deptId -> 正确率（百分制，如 85.50）
     */
    Map<Long, BigDecimal> getDeptsAccuracyMap(List<Long> deptIds, String startDate, String endDate);

    /**
     * 获取抽问抽答正确率分析（全站各分类正确率）
     * 返回全站平均正确率、各分类正确率及最高/薄弱标注
     *
     * @param startDate 开始日期（yyyy-MM-dd）
     * @param endDate   结束日期（yyyy-MM-dd）
     * @return 正确率分析结果
     */
    QuizAccuracyAnalysisResultDto getQuizAccuracyAnalysis(String startDate, String endDate);
}
