package shop.alien.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import shop.alien.entity.store.UserReservation;
import shop.alien.entity.store.vo.StoreReservationListVo;

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

/**
 * 用户预约信息表 Mapper 接口
 *
 * @author system
 */
public interface UserReservationMapper extends BaseMapper<UserReservation> {

    /**
     * 查询商家端预约信息列表
     *
     * @param storeId    门店ID（必填）
     * @param status     预约状态（可选，0:待确认 1:已确认 2:已到店 3:已取消 4:未到店超时）
     * @param dateFrom   预约日期起（可选）
     * @param dateTo     预约日期止（可选）
     * @param orderStatus 订单状态（可选，0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订）
     * @return 预约信息列表
     */
    List<StoreReservationListVo> getStoreReservationList(
            @Param("storeId") Integer storeId,
            @Param("status") Integer status,
            @Param("dateFrom") Date dateFrom,
            @Param("dateTo") Date dateTo,
            @Param("orderStatus") Integer orderStatus
    );

    /**
     * 按主键物理删除预约（与 add 新建的表对应，用于 delete 接口）
     *
     * @param id 预约ID
     * @return 删除行数
     */
    int physicalDeleteById(@Param("id") Integer id);

    /**
     * 关联查询：订单为待使用(1)，且已超过未到店截止时间的 reservation_id 列表。
     * 当门店 store_booking_settings.retain_position_flag = 1 时：截止时间 = start_time + retention_duration（分钟）；
     * 否则：仅按 start_time 判断超时。
     * 用于定时任务将「未到店超时」的预订与订单批量更新。
     *
     * @return 需要标记为已过期/未到店超时的 user_reservation.id 列表
     */
    List<Integer> listReservationIdsForTimeoutMark();

    /**
     * 查询分类下是否有符合条件的预订信息
     * 条件：订单状态为"待使用"(1)或"已完成"(2)
     * 对于"已完成"状态的订单，结束时间需要在当前时间3小时内
     *
     * @param categoryId 分类ID
     * @param storeId    门店ID
     * @return 符合条件的预订数量
     */
    long countReservationsByCategoryAndOrderStatus(
            @Param("categoryId") Integer categoryId,
            @Param("storeId") Integer storeId
    );

    /**
     * 查询桌号下是否有符合条件的预订信息
     * 条件：订单状态为"待使用"(1)或"已完成"(2)
     * 对于"已完成"状态的订单，结束时间需要在当前时间3小时内
     *
     * @param tableId 桌号ID
     * @param storeId 门店ID
     * @return 符合条件的预订数量
     */
    long countReservationsByTableAndOrderStatus(
            @Param("tableId") Integer tableId,
            @Param("storeId") Integer storeId
    );
}
