package org.dromara.ai.service;

import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.ai.domain.bo.AiUsageStatsBo;
import org.dromara.ai.domain.vo.AiUsageStatsVo;

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

/**
 * AI使用统计Service接口
 *
 * @author pengles
 */
public interface AiUsageStatsService {

    /**
     * 查询AI使用统计
     */
    AiUsageStatsVo queryById(Long id);

    /**
     * 查询AI使用统计列表
     */
    TableDataInfo<AiUsageStatsVo> queryPageList(AiUsageStatsBo bo, PageQuery pageQuery);

    /**
     * 查询AI使用统计列表
     */
    List<AiUsageStatsVo> queryList(AiUsageStatsBo bo);

    /**
     * 记录使用统计
     *
     * @param userId       用户ID
     * @param providerName Provider名称
     * @param modelName    模型名称
     * @param tokens       使用的Token数
     * @param cost         成本
     * @param responseTime 响应时间(毫秒)
     * @param success      是否成功
     */
    void recordUsage(Long userId, String providerName, String modelName,
                     Long tokens, java.math.BigDecimal cost, Integer responseTime, Boolean success);

    /**
     * 获取汇总统计
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 汇总统计数据
     */
    Map<String, Object> getSummaryStats(Date startDate, Date endDate);

    /**
     * 获取用户统计
     *
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 用户统计数据
     */
    Map<String, Object> getUserStats(Long userId, Date startDate, Date endDate);

    /**
     * 获取Provider统计
     *
     * @param providerName Provider名称
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return Provider统计数据
     */
    Map<String, Object> getProviderStats(String providerName, Date startDate, Date endDate);

    /**
     * 获取趋势数据
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param groupBy   分组方式（day/week/month）
     * @return 趋势数据列表
     */
    List<Map<String, Object>> getTrendData(Date startDate, Date endDate, String groupBy);

}
