package cn.novalon.gym.manage.datacount.service;

import cn.novalon.gym.manage.datacount.domain.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * 数据统计服务接口
 *
 * @author system
 * @date 2026-06-09
 */
public interface IDataStatisticsService {

    /**
     * 获取会员统计数据
     *
     * @param query 查询条件
     * @return 会员统计数据
     */
    Mono<MemberStatistics> getMemberStatistics(StatisticsQuery query);

    /**
     * 获取预约统计数据
     *
     * @param query 查询条件
     * @return 预约统计数据
     */
    Mono<BookingStatistics> getBookingStatistics(StatisticsQuery query);

    /**
     * 获取签到统计数据
     *
     * @param query 查询条件
     * @return 签到统计数据
     */
    Mono<SignInStatistics> getSignInStatistics(StatisticsQuery query);

    /**
     * 获取综合统计数据（包含会员、预约、签到）
     *
     * @param query 查询条件
     * @return 综合统计数据
     */
    Mono<StatisticsSummary> getStatisticsSummary(StatisticsQuery query);

    /**
     * 查询历史统计数据
     *
     * @param query 查询条件
     * @return 历史统计数据列表
     */
    Flux<DataStatistics> queryHistoricalStatistics(StatisticsQuery query);

    /**
     * 执行每日统计数据更新（定时任务调用）
     *
     * @param statDate 统计日期
     * @return 更新结果
     */
    Mono<Void> executeDailyStatistics(java.time.LocalDate statDate);

    /**
     * 导出统计数据为Excel
     *
     * @param query 查询条件
     * @return Excel文件的字节数组
     */
    Mono<byte[]> exportStatistics(StatisticsQuery query);

    /**
     * 获取统计数据（带缓存）
     *
     * @param query 查询条件
     * @return 统计数据
     */
    Mono<StatisticsSummary> getStatisticsSummaryWithCache(StatisticsQuery query);
}
