package com.sptg.device.biz.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.sptg.common.core.beans.PageBean;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.common.core.enums.Instruct;
import com.sptg.device.api.dto.AccessCardSimpleDto;
import com.sptg.device.api.dto.DeviceDto;
import com.sptg.device.api.dto.FaceInfoDto;
import com.sptg.device.api.entity.Device;
import com.sptg.device.api.vo.DeviceVO;

import java.util.List;

/**
 * title: DeviceServiceInterface
 * package: com.sptg.device.biz.security
 * description: 设备业务层接口
 *
 *
 *
 */
public interface DeviceServiceInterface extends IService<Device> {

    /**
     * 功能描述: 分页查询设备信息
     * @param pageBean 设备数据传输对象
     * @return Page<Device>
     *
     *
     */
    Page<Device> pagingQuery(PageBean<Device,DeviceDto> pageBean);

    /**
     * 功能描述: 根据小区Id获取设备
     * @param xqId 小区Id
     * @return List<Device>
     *
     *
     */
    List<Device> selectListByXqId(Long xqId);

    /**
     * 功能描述: 根据单元Id获取设备
     * @param dyId 单元Id
     * @return List<Device>
     *
     *
     */
    List<Device> selectListByDyId(Long dyId);

    /**
     * 功能描述: 根据区域编号分页查询
     * @param regionId 区域编号
     * @param page 分页信息
     * @return Page<Device>
     *
     *
     */
    Page<Device> selectListByRegion(Long regionId,Page<Device> page);

    /**
     * 功能描述: 根据设备序列号获取设备信息
     * @param serialNumber 设备序列号
     * @return Device
     *
     *
     */
    Device selectBySerialNumber(String serialNumber);

    /**
     * 功能描述: 根据设备序列号获取设备信息
     * @param factory 设备序列号
     * @return Device
     *
     *
     */
    Device selectByFactory(String factory);

    /**
     * 功能描述: 获取某小区下的设备最大排序值
     * @param xqId 小区Id
     * @return Integer
     *
     *
     */
    Integer selectMaxXqSort(Long xqId);

    /**
     * 获取小区下未绑定单元或指定单元的设备列表
     * @param xqId 小区Id
     * @param unitId 单元Id
     * @return List<Device>
     */
    List<Device> getListByEstateUser(Long xqId,Long unitId);

    /**
     * 获取小区下未绑定单元或指定单元的或被排除的设备厂商的设备列表
     * @return List<Device>
     */
    List<Device> getListByCondition(DeviceVO deviceVO);

    /**
     * 获取机构路径下的设备列表
     * @return List<Device>
     */
    List<Device> getListByOrgPosition(DeviceVO deviceVO);

    /**
     * 获取小区下未绑定单元或指定单元的，并且是指定设备位置用途的设备
     * @param xqId 小区Id
     * @param unitId 单元Id
     * @return List<Device>
     */
    List<Device> getListByPathUse(Long xqId,Long unitId, Integer pathUse);

    /**
     * 设备心跳频率
     */
    int HEART_RATE = 1000 * 60 * 30;

    /**
     * 根据单元Id列表获取设备
     * @param idList 单元Id列表
     * @return List<Device>
     */
    default List<Device> selectListByUnitIds(List<Long> idList){
        Wrapper<Device> wrapper = new EntityWrapper<>();
        wrapper.in("l_unit_id",idList);
        return this.selectList(wrapper);
    }

    List<Device> getOfflineDeviceAccount(Device device);

    /**
     *
     * @param xqId
     * @param unitId
     * @param pathUse
     * @param type 1：卡片机，2：人脸机，3：卡片人脸机
     * @return
     */
    List<Device> getDeviceByPathUseAndType(Long xqId, Long unitId, Integer pathUse, Integer type);

    /**
     * 根据小区ids 获取设备 - 分页
     * @param deviceDto
     * @return
     */
    ResultBean<Page<Device>> pagingByResidentialIds(DeviceDto deviceDto);

    boolean complete(DeviceDto deviceDto);

    Page<Device> getPageByCondition(PageBean<Device,DeviceDto> pageBean);

    List<Device> getListBySerialNumbers(String serialNumbers);
}
