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

import cn.novalon.gym.manage.checkIn.vo.QRCodeVo;
import cn.novalon.gym.manage.checkIn.vo.SignInRecordVO;
import cn.novalon.gym.manage.checkIn.vo.SignInStatsVO;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDate;

/**
 * 签到服务接口
 *
 * @author 付嘉
 * @date 2026-06-08
 */
public interface ICheckInService {

    /**
     * 获取签到二维码
     *
     * @param memberId 会员ID
     * @return 二维码VO
     */
    Mono<QRCodeVo> getQRCode(Long memberId);

    /**
     * 扫码签到
     *
     * @param memberId 会员ID
     * @param qrContent 二维码内容
     * @return 签到结果JSON字符串
     */
    Mono<String> checkIn(Long memberId, String qrContent);

    /**
     * 查询会员签到记录列表
     *
     * @param memberId 会员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 签到记录列表
     */
    Flux<SignInRecordVO> getSignInRecords(Long memberId, LocalDate startTime, LocalDate endTime);

    /**
     * 根据ID查询签到记录
     *
     * @param id 签到记录ID
     * @return 签到记录VO
     */
    Mono<SignInRecordVO> getSignInRecordById(Long id);

    /**
     * 获取会员签到统计
     *
     * @param memberId 会员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 签到统计VO
     */
    Mono<SignInStatsVO> getSignInStats(Long memberId, LocalDate startTime, LocalDate endTime);

    /**
     * 导出会员签到记录
     *
     * @param memberId 会员ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return CSV格式的字节数组
     */
    Mono<byte[]> exportSignInRecords(Long memberId, LocalDate startTime, LocalDate endTime);

    /**
     * 获取每日签到统计
     *
     * @param date 日期
     * @return 签到统计VO
     */
    Mono<SignInStatsVO> getDailySignInStats(LocalDate date);
}
