package shop.alien.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import shop.alien.entity.store.UserReservationOrder;
import shop.alien.entity.store.vo.ReservationOrderCountsDto;
import shop.alien.entity.store.vo.ReservationOrderListDto;

import java.util.List;

/**
 * 用户预订订单表 Mapper 接口
 *
 * @author system
 */
@Mapper
public interface UserReservationOrderMapper extends BaseMapper<UserReservationOrder> {

    /**
     * 按预约ID物理删除订单（与 add 新建的 user_reservation_order 对应，用于 delete 接口）
     *
     * @param reservationId 预约ID
     * @return 删除行数
     */
    @Delete("DELETE FROM user_reservation_order WHERE reservation_id = #{reservationId}")
    int physicalDeleteByReservationId(@Param("reservationId") Integer reservationId);

    /**
     * 预订订单列表分页：按用户、店铺名称模糊（限10字）、订单状态筛选
     *
     * @param page       分页对象
     * @param userId     用户ID
     * @param storeName  店铺名称（可选，前端限10字，模糊）
     * @param orderStatus 订单状态（可选）
     * @return 分页结果
     */
    IPage<ReservationOrderListDto> selectOrderListPage(IPage<ReservationOrderListDto> page,
                                                        @Param("userId") Integer userId,
                                                        @Param("storeName") String storeName,
                                                        @Param("orderStatus") Integer orderStatus);

    /**
     * 按用户统计：全部/待使用(1)/已完成(2)/已退款(7) 数量
     *
     * @param userId 用户ID
     * @return 各状态数量
     */
    ReservationOrderCountsDto selectOrderCountsByUserId(@Param("userId") Integer userId);

    /**
     * 查询待使用订单且预定开始时间在「当前时间～当前时间+30分钟」内的订单ID列表，用于到店提醒短信
     *
     * @return 订单ID列表
     */
    List<Integer> listOrderIdsForArrivalReminder();

    /**
     * 查询支付状态为「退款中」(4) 的付费订单ID列表，用于定时任务重试退款
     *
     * @return 订单ID列表
     */
    List<Integer> listOrderIdsForRefundRetry();
}
