package com.ruoyi.analytics.mapper;

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

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 报表分析数据访问接口
 * 
 * @author ruoyi
 * @date 2025-12-19
 */
@Mapper
public interface ReportAnalyticsMapper
{
    /**
     * 查询债权统计数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param groupBy 分组方式
     * @return 统计数据列表
     */
    List<Map<String, Object>> selectCreditStatistics(@Param("startDate") Date startDate, 
                                                    @Param("endDate") Date endDate, 
                                                    @Param("groupBy") String groupBy);

    /**
     * 查询债权总数
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 债权总数
     */
    Long selectTotalCreditCount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询债权总金额
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 债权总金额
     */
    BigDecimal selectTotalCreditAmount(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询已结清债权统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 已结清债权统计
     */
    Map<String, Object> selectSettledCreditStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询未结清债权统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 未结清债权统计
     */
    Map<String, Object> selectUnsettledCreditStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询逾期债权统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 逾期债权统计
     */
    Map<String, Object> selectOverdueCreditStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询收益分析数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param analysisType 分析类型
     * @return 收益分析数据
     */
    List<Map<String, Object>> selectRevenueAnalysis(@Param("startDate") Date startDate, 
                                                   @Param("endDate") Date endDate, 
                                                   @Param("analysisType") String analysisType);

    /**
     * 查询融资收入统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 融资收入统计
     */
    Map<String, Object> selectFinancingRevenueStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询服务收入统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 服务收入统计
     */
    Map<String, Object> selectServiceRevenueStatistics(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询成本分析数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 成本分析数据
     */
    Map<String, Object> selectCostAnalysis(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询风险评估基础数据
     * 
     * @param assessmentType 评估类型
     * @param parameters 评估参数
     * @return 风险评估数据
     */
    List<Map<String, Object>> selectRiskAssessmentData(@Param("assessmentType") String assessmentType, 
                                                       @Param("parameters") Map<String, Object> parameters);

    /**
     * 查询趋势分析历史数据
     * 
     * @param metric 指标名称
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param groupBy 分组方式
     * @return 趋势数据
     */
    List<Map<String, Object>> selectTrendAnalysisData(@Param("metric") String metric, 
                                                     @Param("startDate") Date startDate, 
                                                     @Param("endDate") Date endDate, 
                                                     @Param("groupBy") String groupBy);

    /**
     * 查询合同状态分布
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 合同状态分布
     */
    List<Map<String, Object>> selectContractStatusDistribution(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 查询公司维度统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param companyType 公司类型
     * @return 公司维度统计
     */
    List<Map<String, Object>> selectCompanyDimensionStatistics(@Param("startDate") Date startDate, 
                                                              @Param("endDate") Date endDate, 
                                                              @Param("companyType") String companyType);

    /**
     * 查询月度趋势数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param metricType 指标类型
     * @return 月度趋势数据
     */
    List<Map<String, Object>> selectMonthlyTrendData(@Param("startDate") Date startDate, 
                                                    @Param("endDate") Date endDate, 
                                                    @Param("metricType") String metricType);

    /**
     * 查询同比数据
     * 
     * @param currentDate 当前日期
     * @param metricType 指标类型
     * @return 同比数据
     */
    Map<String, Object> selectYearOverYearData(@Param("currentDate") Date currentDate, @Param("metricType") String metricType);

    /**
     * 查询环比数据
     * 
     * @param currentDate 当前日期
     * @param metricType 指标类型
     * @return 环比数据
     */
    Map<String, Object> selectMonthOverMonthData(@Param("currentDate") Date currentDate, @Param("metricType") String metricType);

    /**
     * 查询异常数据检测
     * 
     * @param dataType 数据类型
     * @param threshold 阈值
     * @return 异常数据列表
     */
    List<Map<String, Object>> selectAnomalyDetection(@Param("dataType") String dataType, @Param("threshold") Double threshold);

    /**
     * 查询关联分析数据
     * 
     * @param metric1 指标1
     * @param metric2 指标2
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 关联分析数据
     */
    List<Map<String, Object>> selectCorrelationAnalysis(@Param("metric1") String metric1, 
                                                       @Param("metric2") String metric2, 
                                                       @Param("startDate") Date startDate, 
                                                       @Param("endDate") Date endDate);

    /**
     * 查询自定义聚合数据
     * 
     * @param tableName 表名
     * @param selectFields 查询字段
     * @param groupByFields 分组字段
     * @param whereConditions 查询条件
     * @return 聚合数据
     */
    List<Map<String, Object>> selectCustomAggregateData(@Param("tableName") String tableName, 
                                                       @Param("selectFields") String selectFields, 
                                                       @Param("groupByFields") String groupByFields, 
                                                       @Param("whereConditions") String whereConditions);
}