package com.fuyuanshen.equipment.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.domain.dto.InstructionRecordDto;
import com.fuyuanshen.equipment.domain.form.DeviceForm;
import com.fuyuanshen.equipment.domain.query.DeviceQueryCriteria;
import com.fuyuanshen.equipment.domain.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

/**
 * @Description:
 * @Author: WY
 * @Date: 2025/5/16
 **/
@Mapper
public interface DeviceMapper extends BaseMapper<Device> {

    /**
     * 分页查询设备
     *
     * @param criteria
     * @param page
     * @return
     */
    IPage<Device> findAll(@Param("criteria") DeviceQueryCriteria criteria, Page<Device> page);

    List<Device> findAll(@Param("criteria") DeviceQueryCriteria criteria);

    IPage<Device> findAllTerminal(@Param("criteria") DeviceQueryCriteria criteria, Page<Device> page);

    List<Device> findAllDevices(@Param("criteria") DeviceQueryCriteria criteria);

    /**
     * 根据条件查询
     *
     * @param criteria
     * @return
     */
    List<Device> findDevices(@Param("criteria") DeviceQueryCriteria criteria);

    /**
     * 查询APP绑定设备列表
     *
     * @param criteria
     * @return
     */
    Page<AppDeviceVo> queryAppBindDeviceList(Page<AppDeviceVo> page, @Param("criteria") DeviceQueryCriteria criteria);


    Page<AppDeviceVo> queryAppDeviceList(Page<AppDeviceVo> page, @Param("criteria") DeviceQueryCriteria criteria);

    /**
     * 获取分配设备的客户
     *
     * @param customerId
     * @return
     */
    Device getAssignCustomer(Long customerId);

    /**
     * 获取设备链
     *
     * @param originalDeviceId
     * @return
     */
    List<Device> findByOriginalDeviceId(Long originalDeviceId);

    AppDeviceVo getDeviceInfo(@Param("deviceMac") String deviceMac);

    Page<WebDeviceVo> queryWebDeviceList(Page<Object> build, @Param("criteria") DeviceQueryCriteria criteria);

    Page<LocationHistoryVo> getLocationHistory(Page<Object> build, @Param("bo") InstructionRecordDto criteria);

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

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

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

    /**
     * 获取设备使用数据
     *
     * @param deviceTypeId 设备ID
     * @param range    时间范围 1:半年 2:一年
     * @return 每月使用数据列表
     */
    List<Map<String, Object>> getEquipmentUsageData(@Param("deviceTypeId") Long deviceTypeId, @Param("range") Integer range);

    // 在DeviceMapper.java中添加方法
    DeviceOverviewVo getDeviceOverview();

    // 在DeviceMapper.java中添加方法
    int getUsageDataForMonth(@Param("deviceId") Long deviceId,
                             @Param("year") int year,
                             @Param("month") int month);
                             
    /**
     * 根据设备IMEI查询设备
     *
     * @param deviceImei 设备IMEI
     * @return 设备信息
     */
    Device selectDeviceByImei(@Param("deviceImei") String deviceImei);

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

    /**
     * 获取设备使用频次统计
     *
     * @param days 天数
     * @return 设备使用频次统计列表
     */
    List<DeviceUsageFrequencyVo> getDeviceUsageFrequency(@Param("days") int days);

    List<OnlineStatusVo> queryOnlineStatusList();

    /**
     * 根据设备类型ID查询设备数量
     *
     * @param deviceTypeId 设备类型ID
     * @return 设备数量
     */
    int countByDeviceTypeId(@Param("deviceTypeId") Long deviceTypeId);

    List<Map<String, Object>> GetDeviceByName(DeviceForm deviceForm);

    int getEquipCountByType(DeviceForm deviceForm);

    List<Map<String,Object>> getEquipAllByType(DeviceForm deviceForm);

}