package com.ruoyi.bst.device.service;

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

import com.ruoyi.bst.device.domain.Device;
import com.ruoyi.bst.device.domain.DeviceVO;
import com.ruoyi.bst.device.domain.dto.DeviceBltUploadDTO;
import com.ruoyi.bst.device.domain.enums.DeviceUnLockType;
import com.ruoyi.bst.device.domain.vo.DeviceIotVO;

public interface DeviceIotService {

    /**
     * 开锁
     *
     * @param device 设备
     * @param type   是否管理员操作
     * @param reason 原因
     * @return 结果
     */
    DeviceIotVO unlock(DeviceVO device, DeviceUnLockType type, String reason, boolean requiredIot, int tryCount);

    default DeviceIotVO unlock(DeviceVO device, DeviceUnLockType type, String reason, boolean requiredIot) {
        return unlock(device, type, reason, requiredIot, 1);
    }

    /**
     * 锁车
     *
     * @param device      设备
     * @param isAdmin     是否管理员操作
     * @param reason      原因
     * @param requiredIot 是否IOT操作必须成功
     * @return 结果
     */
    DeviceIotVO lock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot, int tryCount);

    default DeviceIotVO lock(DeviceVO device, boolean isAdmin, String reason, boolean requiredIot) {
        return lock(device, isAdmin, reason, requiredIot, 1);
    }

    /**
     * 强制断电
     *
     * @param device      设备
     * @param reason      原因
     * @param requiredIot 是否IOT操作必须成功
     * @return 结果
     */
    DeviceIotVO qLock(DeviceVO device, String reason, boolean requiredIot, int tryCount);

    default DeviceIotVO qLock(DeviceVO device, String reason, boolean requiredIot) {
        return qLock(device, reason, requiredIot, 1);
    }

    /**
     * 播放语音
     *
     * @param device      设备
     * @param type        语音类型
     * @param reason      原因
     * @param requiredIot
     * @return 结果
     */
    boolean play(DeviceVO device, String type, String reason, boolean requiredIot);

    /**
     * 重启
     *
     * @param device      设备
     * @param reason      原因
     * @param requiredIot
     * @return 结果
     */
    boolean reboot(DeviceVO device, String reason, boolean requiredIot);

    /**
     * 开坐垫锁
     *
     * @param device      设备
     * @param reason      原因
     * @param requiredIot
     * @return 结果
     */
    boolean unlockSeat(DeviceVO device, String reason, boolean requiredIot);

    /**
     * 刷新
     *
     * @param device     设备
     * @param onlineType 在线类型
     * @return 结果
     */
    default void refresh(DeviceVO device, String onlineType) {
        refresh(Collections.singletonList(device), onlineType);
    }

    /**
     * 刷新
     *
     * @param deviceList 设备列表
     * @param onlineType 在线类型
     * @return 结果
     */
    void refresh(List<DeviceVO> deviceList, String onlineType);

    /**
     * 创建OneNet设备
     *
     * @param mac 设备mac地址
     */
    boolean create(String mac);

    /**
     * 锁车
     *
     * @param id          设备ID
     * @param isAdmin     是否管理员操作
     * @param reason      原因
     * @param requiredIot 是否IOT操作必须成功
     * @return 结果
     */
    DeviceIotVO lock(Long id, boolean isAdmin, String reason, boolean requiredIot);

    /**
     * 开锁
     *
     * @param id     设备ID
     * @param type   是否管理员操作
     * @param reason 原因
     * @return 结果
     */
    DeviceIotVO unlock(Long id, DeviceUnLockType type, String reason, boolean requiredIot);

    /**
     * 监控设备
     *
     * @param ids 设备ID列表，若为空，则监控所有设备
     */
    void monitor(List<Long> ids);

    /**
     * 监控设备
     *
     * @param mac 设备mac地址
     */
    void monitor(String mac);

    /**
     * 设置声音
     *
     * @param device      设备
     * @param music       声音
     * @param reason      原因
     * @param requiredIot 是否IOT操作必须成功
     * @return 结果
     */
    DeviceIotVO setMusic(DeviceVO device, String music, String reason, boolean requiredIot);

    /**
     * 更新物联网信息
     *
     * @param device
     * @return
     */
    int updateIot(Device device);

    /**
     * 蓝牙上传
     *
     * @param dto
     */
    int bltUpload(DeviceBltUploadDTO dto);

    /**
     * 获取设备物联网数据
     *
     * @param mac 设备mac地址
     * @return 设备在线状态
     */
    Map<String, Object> getIotInfo(String mac);

}
