package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.haha.common.vo.DeviceStatisticsVO;
import com.haha.entity.Device;
import com.haha.common.vo.OpenDoorVO;
import com.haha.sdk.exception.HahaException;

import java.util.List;
import java.util.Map;

public interface DeviceService extends IService<Device> {
    
    /**
     * 分页查询设备列表
     *
     * @param page     页码
     * @param pageSize 每页条数
     * @param deviceId 设备ID（模糊）
     * @param shopId   门店ID
     * @param status   状态
     * @return 分页结果
     */
    IPage<Device> getPage(int page, int pageSize, String deviceId, Long shopId, Integer status);
    
    /**
     * 获取设备详情（带标签填充）
     *
     * @param id 设备ID
     * @return 设备详情
     */
    Device getDetailById(Long id);
    
    /**
     * 获取设备统计数据
     *
     * @return 统计数据
     */
    DeviceStatisticsVO getStatistics();
    
    /**
     * 远程开门
     *
     * @param id       设备ID
     * @param doorIndex 门索引
     * @return 是否成功
     */
    boolean openDoor(Long id, String doorIndex);
    
    /**
     * 设置温度
     *
     * @param id          设备ID
     * @param temperature 温度值
     * @return 是否成功
     */
    boolean setTemperature(Long id, Double temperature);
    
    /**
     * 设置音量
     *
     * @param id     设备ID
     * @param volume 音量值
     * @return 是否成功
     */
    boolean setVolume(Long id, Integer volume);
    
    List<Device> getNearbyDevices(Double longitude, Double latitude, Double distance);
    Device getDeviceBySn(String deviceId);
    boolean updateDeviceStatus(String deviceId, Integer status);
    List<Device> getDeviceListByArea(String province, String city, String district);
    boolean updateInventoryHash(String deviceId, String inventoryHash);
    
    /**
     * 扫码开门业务逻辑
     * 
     * @param deviceId 设备ID
     * @param userId 用户ID
     * @return 开门结果
     * @throws HahaException 开门失败时抛出
     */
    OpenDoorVO scanOpenDoor(String deviceId, Long userId) throws HahaException;

    /**
     * 将设备关联到门店
     *
     * @param deviceId 设备ID
     * @param shopId    门店ID（null表示取消关联）
     * @return 是否成功
     */
    boolean linkToShop(Long deviceId, Long shopId);

    /**
     * 批量将设备关联到门店
     *
     * @param deviceIds 设备ID列表
     * @param shopId    门店ID（null表示批量取消关联）
     * @return 成功关联的数量
     */
    int batchLinkToShop(List<Long> deviceIds, Long shopId);

    /**
     * 获取未关联门店的设备列表
     *
     * @return 设备列表
     */
    List<Device> getUnlinkedDevices();
    
    /**
     * 根据门状态查询设备列表
     *
     * @param doorStatus 门状态
     * @return 设备列表
     */
    List<Device> getDevicesByDoorStatus(String doorStatus);
    
    /**
     * 更新设备门状态
     *
     * @param deviceId 设备ID
     * @param doorStatus 门状态
     * @return 是否成功
     */
    boolean updateDeviceDoorStatus(String deviceId, String doorStatus);
    
    /**
     * 批量更新设备门状态
     *
     * @param deviceStatusMap 设备ID和门状态的映射
     * @return 成功更新的数量
     */
    int batchUpdateDeviceDoorStatus(Map<String, String> deviceStatusMap);

    /**
     * 根据错误码返回友好的错误信息
     *
     * @param errorCode  错误码
     * @param defaultMsg 默认错误信息
     * @return 友好的错误描述
     */
    String getHahaErrorMessage(Integer errorCode, String defaultMsg);

    /**
     * 查询设备详细状态（含门状态、锁状态、摄像头状态、网络状态）
     *
     * @param deviceId 设备SN号
     * @return 设备详细状态信息
     */
    Map<String, Object> getDeviceDetailStatus(String deviceId);
}
