package com.haha.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.haha.entity.DoorRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 设备开关门记录 Mapper 接口
 * 
 * @author haha
 */
@Mapper
public interface DoorRecordMapper extends BaseMapper<DoorRecord> {

    /**
     * 根据活动 ID 查询开门记录
     * 
     * @param activityId 活动 ID
     * @return 开门记录
     */
    DoorRecord getByActivityId(@Param("activityId") String activityId);

    /**
     * 根据用户 ID 查询最近的开门记录
     * 
     * @param userId 用户 ID
     * @param deviceId 设备 ID
     * @param limit 限制数量
     * @return 开门记录列表
     */
    List<DoorRecord> getRecentRecords(
        @Param("userId") Long userId, 
        @Param("deviceId") String deviceId,
        @Param("limit") int limit
    );

    /**
     * 更新门状态
     * 
     * @param activityId 活动 ID
     * @param doorStatus 门状态
     * @param closeTime 关门时间
     * @return 影响行数
     */
    int updateDoorStatus(
        @Param("activityId") String activityId,
        @Param("doorStatus") String doorStatus,
        @Param("closeTime") LocalDateTime closeTime
    );

    /**
     * 关联订单 ID
     * 
     * @param activityId 活动 ID
     * @param orderId 订单 ID
     * @return 影响行数
     */
    int linkOrderId(@Param("activityId") String activityId, @Param("orderId") Long orderId);

    /**
     * 标记无消费记录
     * 
     * @param activityId 活动 ID
     * @return 影响行数
     */
    int markNoConsume(@Param("activityId") String activityId);

    /**
     * 更新支付分预授权信息到开门记录
     *
     * @param activityId      活动 ID
     * @param payScoreOrderId 支付分预授权订单号
     * @param serviceId       服务 ID
     * @return 影响行数
     */
    int updatePayScorePreAuth(@Param("activityId") String activityId,
                              @Param("payScoreOrderId") String payScoreOrderId,
                              @Param("serviceId") String serviceId);

    /**
     * 统计指定时间范围内的开门次数
     * 
     * @param deviceId 设备 ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 开门次数
     */
    int countByTimeRange(
        @Param("deviceId") String deviceId,
        @Param("startTime") LocalDateTime startTime,
        @Param("endTime") LocalDateTime endTime
    );
}
