package com.haha.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.entity.DoorRecord;

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

/**
 * 设备开关门记录服务接口
 * 
 * @author haha
 */
public interface DoorRecordService extends IService<DoorRecord> {

    /**
     * 保存开门记录（Redis + 数据库双存储）
     * 
     * @param deviceId 设备 ID
     * @param userId 用户 ID
     * @param activityId 活动 ID
     * @param doorIndex 门索引
     * @param openType 开门类型
     * @param source 记录来源
     * @return 开门记录
     */
    DoorRecord saveDoorOpenRecord(
        String deviceId, 
        Long userId, 
        String activityId,
        String doorIndex,
        String openType,
        String source
    );

    /**
     * 根据活动 ID 获取开门记录
     * 
     * @param activityId 活动 ID
     * @return 开门记录
     */
    DoorRecord getByActivityId(String activityId);

    /**
     * 更新门状态为已关门
     * 
     * @param activityId 活动 ID
     * @return 是否成功
     */
    boolean updateDoorClosed(String activityId);

    /**
     * 标记无消费记录
     * 
     * @param activityId 活动 ID
     * @return 是否成功
     */
    boolean markNoConsume(String activityId);

    /**
     * 关联订单 ID
     * 
     * @param activityId 活动 ID
     * @param orderId 订单 ID
     * @return 是否成功
     */
    boolean linkOrderId(String activityId, Long orderId);

    /**
     * 将支付分预授权信息持久化到开门记录
     *
     * @param activityId      活动 ID
     * @param payScoreOrderId 支付分预授权订单号
     * @param serviceId       服务 ID
     * @return 是否成功
     */
    boolean updatePayScorePreAuth(String activityId, String payScoreOrderId, String serviceId);

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

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

    /**
     * 清理过期的 Redis 开门记录（保留最近 30 分钟）
     */
    void cleanupExpiredRedisRecords();

    /**
     * 分页查询设备的开关门记录
     * 
     * @param deviceId 设备 ID
     * @param page 页码
     * @param pageSize 每页数量
     * @return 开门记录分页数据
     */
    com.baomidou.mybatisplus.core.metadata.IPage<DoorRecord> getDeviceRecordsByPage(
        String deviceId, 
        int page, 
        int pageSize
    );
}
