package com.fuyuanshen.equipment.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuyuanshen.common.mybatis.core.page.PageQuery;
import com.fuyuanshen.common.mybatis.core.page.TableDataInfo;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.dto.AppDeviceBo;
import com.fuyuanshen.equipment.domain.form.DeviceForm;
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
import com.fuyuanshen.equipment.domain.vo.*;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @Description:
 * @Author: WY
 * @Date: 2025/5/16
 **/
public interface DeviceService extends IService<Device> {

    /**
     * 查询设备数据分页
     *
     * @param criteria 条件
     * @param page     分页参数
     * @return PageResult
     */
    TableDataInfo<Device> queryAll(DeviceQueryCriteria criteria, Page<Device> page) throws IOException;

    TableDataInfo<Device> queryAllTerminal(DeviceQueryCriteria criteria, Page<Device> page) throws IOException;

    /**
     * 查询所有数据不分页
     *
     * @param criteria 条件参数
     * @return List<DeviceDto>
     */
    List<Device> queryAll(DeviceQueryCriteria criteria);

    /**
     * 查询所有设备信息
     *
     * @param criteria
     * @return
     */
    List<Device> queryAllDevices(DeviceQueryCriteria criteria);

    /**
     * 新增设备
     *
     * @param resources
     */
    void addDevice(DeviceForm resources) throws Exception;

    /**
     * 修改设备
     *
     * @param resources /
     */
    void update(DeviceForm resources) throws Exception;

    /**
     * 批量删除
     *
     * @param ids /
     */
    void deleteAll(List<Long> ids);

    /**
     * 分配客户
     */
    void assignCustomer(CustomerVo customerVo);

    /**
     * 撤回设备
     */
    void withdrawDevice(List<Long> ids);

    /**
     * 解绑设备
     *
     * @param deviceForm
     */
    void unbindDevice(DeviceForm deviceForm);


    /**
     * WEB端查看APP客户设备绑定
     *
     * @param bo
     * @param pageQuery
     * @return
     */
    TableDataInfo<AppDeviceVo> queryAppDeviceList(DeviceQueryCriteria bo, PageQuery pageQuery);

    int bindDevice(AppDeviceBo bo);

    int unBindDevice(Long id);

    /**
     * 检查设备MAC值是否存在
     *
     * @param mac
     * @return
     */
    Boolean queryDevice(String mac);

    /**
     * WEB端解绑设备
     *
     * @param id
     * @return
     */
    int webUnBindDevice(Long id);

    /**
     * 获取数据总览
     *
     * @return
     */
    DataOverviewVo getDataOverview();

    /**
     * 获取设备分类
     *
     * @return
     */
    EquipmentClassificationVo getEquipmentClassification();

    /**
     * 获取告警信息
     *
     * @return
     */
    AlarmInformationVo getAlarmInformation();

    /**
     * 获取设备使用数据
     *
     * @param deviceTypeId
     * @param range
     * @return
     */
    List<Map<String, Object>> getEquipmentUsageData(Long deviceTypeId, Integer range);

    /**
     * 根据设备IMEI查询设备
     *
     * @param deviceImei 设备IMEI
     * @return 设备信息
     */
    Device selectDeviceByImei(String deviceImei);

    /**
     * 获取设备总览数据
     *
     * @return 设备总览数据
     */
    DeviceOverviewVo getDeviceOverview();

    /**
     * 获取设备通讯方式统计数据
     *
     * @return 通讯方式统计数据列表
     */
    List<DeviceCommunicationModeStatisticsVo> getDeviceCommunicationModeStatistics();

    /**
     * 获取设备使用频次统计
     *
     * @param days 天数（近一个月: 30, 近半年: 180）
     * @return 设备使用频次统计列表
     */
    List<DeviceUsageFrequencyVo> getDeviceUsageFrequency(int days);

    /**
     * 根据设备IMEI更新设备的经纬度信息
     *
     * @param deviceImei 设备IMEI
     * @param longitude  经度
     * @param latitude   纬度
     * @return 是否更新成功
     */
    boolean updateDeviceLocationByImei(String deviceImei, String longitude, String latitude);


    /**
     * 根据条件查询设备位置信息
     *
     * @param groupId    设备分组ID
     * @param deviceType 设备类型
     * @param deviceImei 设备IMEI
     * @return 设备位置信息列表
     */
    List<DeviceLocationVo> getDeviceLocationInfo(Long groupId, Long deviceType, String deviceImei);


}