package cn.iocoder.yudao.module.iot.service.device;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*;
import cn.iocoder.yudao.module.iot.controller.admin.devicecontactmodel.vo.DeviceContactModelPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.eclipse.paho.client.mqttv3.MqttException;

import javax.validation.Valid;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 物联设备 Service 接口
 *
 * @author 内蒙必硕
 */
public interface DeviceService {

    /**
     * 创建物联设备
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    DeviceDO createDevice(@Valid DeviceSaveReqVO createReqVO);

    /**
     * 更新物联设备
     *
     * @param updateReqVO 更新信息
     */
    void updateDevice(@Valid DeviceSaveReqVO updateReqVO);

    /**
     * 删除物联设备
     *
     * @param id 编号
     */
    void deleteDevice(List<Long> ids);

    /**
     * 获得物联设备
     *
     * @param id 编号
     * @return 物联设备
     */
    DeviceRespVO getDevice(Long id);
    DeviceDO getDeviceByName(String name);
    DeviceDO getDeviceByTopic(String topic);

    List<DeviceDO> getList(Collection<Long> ids);
    default Map<Long, DeviceDO> getMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getList(ids), DeviceDO::getId);
    }
    /**
     * 获得物联设备分页
     *
     * @param pageReqVO 分页查询
     * @return 物联设备分页
     */
    PageResult<DeviceRespVO> getDevicePage(DevicePageReqVO pageReqVO);
    List<DeviceDO> selectList(DevicePageReqVO reqVO);
    // ==================== 子表（设备属性） ====================

    /**
     * 获得设备属性分页
     *
     * @param pageReqVO 分页查询
     * @param deviceId 设备id
     * @return 设备属性分页
     */
    PageResult<DeviceContactModelDO> getDeviceAttributePage(PageParam pageReqVO, DeviceContactModelPageReqVO deviceModelAttributePageReqVO);

    /**
     * 创建设备属性
     *
     * @param deviceAttribute 创建信息
     * @return 编号
     */
    Long createDeviceAttribute(@Valid DeviceAttributeDO deviceAttribute);

    /**
     * 更新设备属性
     *
     * @param deviceAttribute 更新信息
     */
    void updateDeviceAttribute(@Valid DeviceAttributeDO deviceAttribute);

    /**
     * 删除设备属性
     *
     * @param id 编号
     */
    void deleteDeviceAttribute(Long id);

	/**
	 * 获得设备属性
	 *
	 * @param id 编号
     * @return 设备属性
	 */
    DeviceAttributeDO getDeviceAttribute(Long id);


    Boolean connectDevice(DeviceSaveReqVO createReqVO);

    Long copyDevice(Long id);

    PageResult<LineDeviceRespVO> lineDevicePage(LineDeviceRequestVO pageReqVO);

    List<LineDeviceRespVO> lineDeviceList(LineDeviceRequestVO pageReqVO);

    Map<String, List<Map<String, Object>>>  singleDevice(Long deviceId) throws JsonProcessingException;

    PageResult<Map<String, Object>> historyRecord(Long deviceId,String collectionStartTime, String collectionEndTime,Integer page,Integer size);

    Map<Long, Map<String, Object>> createDeviceDataMap(Long deviceId);

    List<DevicePointRespVO> devicePointList();

    Boolean scheduledStart(Long id);

    Boolean scheduledStop(Long id);

    DeviceOperationStatusRespVO getDeviceOperationalStatus();

    List<Map<String, Object>> getMultiDeviceAttributes(Long goviewId);

    List<DeviceContactModelDO> getDeviceAttributeList(Long deviceId);

    List<Long> deviceLedgerList();

    void updateDeviceEnabled(@Valid DeviceUpdateEnabledReqVO updateEnabledReqVO) throws MqttException;

    DeviceDO getDeviceByMqttTopic(String topic);
}