package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.utils.onenet.DataPointRes;
import com.ruoyi.common.utils.onenet.ResponseVo;
import com.ruoyi.system.domain.AsDevice;
import com.ruoyi.system.domain.EtLocationLog;
import com.ruoyi.system.domain.EtOperatingArea;
import com.ruoyi.system.domain.response.OrderResponse;
import com.ruoyi.system.domain.vo.AsDeviceVO;
import com.ruoyi.system.domain.vo.DeviceNumVo;
import com.ruoyi.system.domain.vo.EtOrderVo;
import com.ruoyi.system.domain.vo.IsInParkingAreaVo;

import java.util.List;

/**
 * 设备Service接口
 *
 * @author 邱贞招
 * @date 2024-04-05
 */
public interface IAsDeviceService extends IService<AsDevice>
{
    /**
     * 查询设备
     *
     * @param deviceId 设备主键
     * @return 设备
     */
    public AsDevice selectAsDeviceByDeviceId(Long deviceId);

    /**
     * 查询设备
     *
     * @param mac 设备主键
     * @return 设备
     */
    public AsDeviceVO selectAsDeviceByMac(String mac);

    /**
     * 根据SN查询设备信息
     *
     * @param sn 设备主键
     * @return 设备
     */
    public AsDevice selectAsDeviceBySn(String sn);

    /**
     * 查询设备列表
     *
     * @param asDevice 设备
     * @return 设备集合
     */
    public List<AsDevice> selectAsDeviceList(AsDevice asDevice);

    /**
     * 查询设备列表
     *
     * @param asDevice 设备
     * @return 设备集合
     */
    public List<AsDevice> selectAsDeviceListWithIsolate(AsDevice asDevice);

    /**
     * 新增设备
     *
     * @param asDevice 设备
     * @return 结果
     */
    public int insertAsDevice(AsDevice asDevice);

    /**
     * 修改设备
     *
     * @param asDevice 设备
     * @return 结果
     */
    public int updateAsDevice(AsDevice asDevice);

    /**
     * 修改设备
     *
     * @param asDevice 设备
     * @return 结果
     */
    public int updateAsDevice2(AsDevice asDevice);

    /**
     * 根据SN修改设备
     *
     * @param asDevice 设备
     * @return 结果
     */
    public int updateAsDeviceBySn(AsDevice asDevice);

    /**
     * 批量删除设备
     *
     * @param deviceIds 需要删除的设备主键集合
     * @return 结果
     */
    public int deleteAsDeviceByDeviceIds(Long[] deviceIds);

    /**
     * 一键上线
     *
     * @param deviceIds 需要一键上线的设备主键集合
     * @return 结果
     */
    public int oneClickOnline(Long[] deviceIds);

    /**
     * 一键下线
     *
     * @param deviceIds 需要一键下线的设备主键集合
     * @return 结果
     */
    public int oneClickOffline(Long[] deviceIds);

    /**
     * 一键出仓
     *
     * @param deviceIds 需要一键出仓的设备主键集合
     * @return 结果
     */
    int oneClickListing(Long[] deviceIds);

    /**
     * 一键入仓
     *
     * @param deviceIds 需要一键入仓的设备主键集合
     * @return 结果
     */
    int oneClickWarehousing(Long[] deviceIds);

    /**
     * 更新设备
     *
     * @param deviceIds 需要更新设备的设备主键集合
     * @return 结果
     */
    int refreshDevice(Long[] deviceIds);

    /**
     * 更新设备
     *
     * @param sn 需要更新设备的设备主键集合
     * @return 结果
     */
    int refreshDeviceBySn(String sn);

    /**
     * 删除设备信息
     *
     * @param deviceId 设备主键
     * @return 结果
     */
    public int deleteAsDeviceByDeviceId(Long deviceId);

    /**
     * 根据经纬度查询附近500米的所有车辆
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @return 结果
     */
    List<AsDevice> vehicleLocalization(String longitude, String latitude,String deptId);

    /**
     * 所有车辆定位
     */
    List<AsDevice> allVehicleInfo(String powerStart, String powerEnd, String status,String sort,String areaId,String onlineStatus);

    /**
     * 查询车辆数量
     */
    DeviceNumVo allVehicleNum(String powerStart, String powerEnd,String areaId);

    /**
     * 扫码/编号开锁骑行
     */
    OrderResponse snSwitch(EtOrderVo orderVo);

    /**
     * 发送命令
     */
    public void sendCommand(String mac, String token,String command,String type,String orderNo,String userName);

    /**
     * 发送命令
     */
    public void sendCommand(String mac, String token,String command,String type,String orderNo,String userName,String msg);

    /**
     * 发送命令(带响应)
     */
    public ResponseVo sendCommandWithResp(String mac, String token, String command, String type,String orderNo);

    /**
     * 发送命令(带响应)
     */
    public ResponseVo sendCommandWithResp(String mac, String token, String command, String type,String orderNo,String lon,String lat);

    /**
     * 查询数据点
     */
    public DataPointRes historyDatapoints(String mac, String token);

    /**
     * 响铃寻车
     */
    Boolean ring(String sn);

    /**
     * 开坐垫锁
     */
    Boolean seatCushionLock(String sn);


    /**
     * 重启设备
     */
    Boolean rebootByMac(String mac);
    /**
     * 重启设备
     */
    Boolean reboot(String sn);

    /**
     * 响铃寻车
     */
    Boolean ringByMac(String mac);

    /**
     * 电压校准
     */
    Boolean check(String sn);

    /**
     * 坐垫锁用mac
     */
    Boolean seatCushionLockByMac(String mac);

    /**
     * 临时锁车
     */
    Boolean lock(String mac,String orderNo,String isBluetooth,String lon,String lat);

    /**
     * 管理员锁车
     */
    Boolean adminLock(String sn,String userName);

    /**
     * 管理员锁车
     */
    Boolean adminLockByMac(String mac,String userName);

    /**
     * 临时解锁
     */
    Boolean unlock(String sn, String orderNo,String isBluetooth,String lon,String lat);

    /**
     * 车辆预约
     */
    OrderResponse deviceAppointment(EtOrderVo appointmentVo);

    /**
     * 取消预约
     */
    OrderResponse cancelAppointment(EtOrderVo appointmentVo, AsDevice asDevice);

    /**
     * 还车
     */
    Boolean returnVehicle(String orderNo,String returnType,String isBluetooth,String lon,String lat,String voltage,String isInParkingArea);

    /**
     * 管理员开锁
     */
    Boolean unlocking(String sn,String userName);

    /**
     * 管理员开锁
     */
    Boolean unlockingByMac(String mac,String userName);

    /**
     * 车辆上线
     */
    Boolean online(String sn);

    /**
     * 车辆下线
     */
    Boolean offline(String sn,String status);

    /**
     * 根据条件模糊查询车辆信息
     * type:1-sn,2-mac,3-车牌号
     */
    List<AsDevice> deviceSearch(String key,String type,String areaId);

    /**
     * 运营中车辆
     */
    String getInOperationDevice(String timeStart, String timeEnd,String areaId);

    /**
     * 有订单车辆
     */
    String getInOrderDevice(String timeStart, String timeEnd,String areaId);

    /**
     * 无订单车辆
     */
    String getNoOrderDevice(String timeStart, String timeEnd,String areaId);

    /**
     * 根据车辆型号查询车辆数量
     */
    Integer selectCountByModelId(Long modelId);

    /**
     * 根据运营区查询车辆数量
     */
    Integer selectCountByAreaId(Long areaId);

    /**
     * 判断是否在运营区
     */
    public Boolean isAreaZone(String sn, EtOperatingArea area);

    /**
     * 判断是否在禁行区内
     */
    public boolean isNoRidingArea(String sn,Long areaId);

    /**
     * 判断是否在禁行区内
     */
    public boolean isNoRidingAreaWithTolerance(String sn,Long areaId,int tolerance);

    /**
     * 低电量不得骑行判断
     */
    boolean isLowBattery(String sn);

    /**
     * 判断是否在运营时间内
     */
    Boolean isOperatingTime(String sn);

    /**
     * 根据运营区id获取所有车辆
     */
    List<AsDevice> allVehicleByArea(Long areaId);


    int updateLocation(AsDevice device);

    /**
     * 判断是否在线
     */
    boolean isOnline(String sn);

    /**
     * 判断是否重复
     */
    boolean checkSNUnique(AsDevice asDevice);

    /**
     * 判断是否重复
     */
    boolean checkMACUnique(AsDevice asDevice);


    /**
     * sn和mac号绑定
     */
    int bandSn(AsDevice asDevice);

    /**
     * 根据mac修改sn
     */
    int updateSn(AsDevice asDevice);

    /**
     * 根据mac号判断是否有绑定过
     */
    boolean isBandByMac(String mac);

    /**
     * 判断是否在停车区内
     */
    IsInParkingAreaVo isInParkingArea(String longitude, String latitude,String areaId,String sn);

    /**
     * 查询版本并更新
     */
    boolean updateVersion(String sn);

    /**
     * 更新最新的位置信息
     */
    boolean updateLatestLocation(String sn);

    /**
     * 获取最新的位置信息
     */
    double[] getLatestLocation(String mac);

    /**
     * 根据时间查询车辆轨迹
     */
    String trajectory(String sn,String startTime,String endTime);

    /**
     * 根据时间查询车辆轨迹
     */
    List<EtLocationLog> trajectoryDetails(String sn, String startTime, String endTime);

    /**
     * 根据订单号查询车辆轨迹
     */
    String trajectoryByOrderNo(String orderNo);

//    /**
//     * 是否靠近运营区边界
//     */
//    boolean isCloseToTheBoundary(String sn, EtOperatingArea area);
}