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

import cn.novalon.gym.manage.groupcourse.domain.GroupCourseBooking;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * 团课预约服务接口
 * 
 * @author 张翔
 * @date 2026-06-01
 */
public interface IGroupCourseBookingService {

    /**
     * 预约团课
     *
     * @param courseId 团课ID
     * @param memberId 会员ID
     * @param memberCardRecordId 会员卡记录ID
     * @return 预约记录
     */
    Mono<GroupCourseBooking> bookCourse(Long courseId, Long memberId, Long memberCardRecordId);

    /**
     * 取消预约
     * 
     * @param bookingId 预约ID
     * @param memberId 会员ID
     * @return 取消后的预约记录
     */
    Mono<GroupCourseBooking> cancelBooking(Long bookingId, Long memberId);

    /**
     * 根据会员ID查询预约记录列表
     * 
     * @param memberId 会员ID
     * @return 预约记录列表
     */
    Flux<GroupCourseBooking> getBookingsByMemberId(Long memberId);

    /**
     * 根据预约ID查询预约详情
     * 
     * @param bookingId 预约ID
     * @return 预约记录
     */
    Mono<GroupCourseBooking> getBookingById(Long bookingId);

    /**
     * 根据团课ID查询预约记录列表
     * 
     * @param courseId 团课ID
     * @return 预约记录列表
     */
    Flux<GroupCourseBooking> getBookingsByCourseId(Long courseId);

    /**
     * 处理已开始课程但未到场会员的预约记录
     * 将状态更新为缺席(3)
     * 
     * @return 处理的记录数
     */
    Mono<Integer> processAbsentMembers();
}