package com.ruoyi.ss.device.mapper;

import com.ruoyi.ss.device.domain.Device;
import com.ruoyi.ss.device.domain.DeviceCountVO;
import com.ruoyi.ss.device.domain.DeviceQuery;
import com.ruoyi.ss.device.domain.dto.DeviceBatchUpdateModelDTO;
import com.ruoyi.ss.device.domain.vo.DeviceMacSnVO;
import com.ruoyi.ss.device.domain.vo.DeviceVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 设备Mapper接口
 *
 * @author 邱贞招
 * @date 2024-02-21
 */
public interface DeviceMapper
{
    /**
     * 查询设备
     *
     * @param deviceId 设备主键
     * @return 设备
     */
    public DeviceVO selectSmDeviceByDeviceId(Long deviceId);

    /**
     * 查询设备列表
     *
     * @param smDevice 设备
     * @return 设备集合
     */
    public List<DeviceVO> selectSmDeviceList(@Param("query") DeviceQuery smDevice);

    /**
     * 新增设备
     *
     * @param device 设备
     * @return 结果
     */
    public int insertSmDevice(Device device);

    /**
     * 修改设备
     *
     * @param device 设备
     * @return 结果
     */
    public int updateSmDevice(Device device);

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

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

    /**
     * 条件查询数量
     * @param dto 条件
     */
    int selectCount(@Param("query") DeviceQuery dto);

    /**
     * 增加设备时长
     *
     * @param deviceId 设备
     * @param time     增加的量
     */
    int addTime(@Param("deviceId") Long deviceId, @Param("num") long time);

    /**
     * 逻辑删除
     */
    int logicDel(@Param("deviceIds") List<Long> deviceIds);

    /**
     * 查询简单数据，不联表
     * @param dto
     * @return
     */
    List<DeviceVO> selectSimpleList(@Param("query") DeviceQuery dto);

    /**
     * 设备绑定店铺
     * @param deviceId 设备id
     * @param storeId 店铺id
     */
    int bind(@Param("deviceId") Long deviceId, @Param("storeId") Long storeId, @Param("userId") Long userId);

    /**
     * 解绑商户
     * @param deviceId 设备id
     */
    int unbindStore(@Param("deviceId") Long deviceId);

    /**
     * 根据MAC查询设备
     * @param mac
     * @return
     */
    DeviceVO selectSimpleSmDeviceByMac(String mac);

    /**
     * 根据店铺id列表，查询设备数量
     * @param storeIds 店铺id列表
     */
    List<DeviceCountVO> selectCountByStoreIds(@Param("storeIds") List<Long> storeIds);

    /**
     * 条件查询数量
     * @param query 查询条件
     */
    List<DeviceCountVO> selectCommonCount(@Param("query") DeviceQuery query);

    /**
     * 根据设备编号查询
     * @param deviceNo
     * @return
     */
    DeviceVO selectByDeviceNo(String deviceNo);

    /**
     * 设备绑定SN
     */
    int bindSn(@Param("deviceId") Long deviceId, @Param("sn") String sn);

    /**
     * 根据SN查询简单数据
     * @param deviceNo
     * @return
     */
    DeviceVO selectSimpleSmDeviceBySn(String deviceNo);

    /**
     * 通过用户id修改服务费率
     */
    int updateServiceRateByStores(@Param("storeIds") List<Long> storeIds, @Param("serviceRate") BigDecimal serviceRate);

    /**
     * 根据MAC修改数据
     * @param device
     */
    int updateSmDeviceByIot(Device device);

    /**
     * 设备超时修改状态
     */
    int changeTimeoutStatus(@Param("deviceId") Long deviceId);

    /**
     * 批量更新在线状态
     */
    int batchUpdateOnlineStatus(@Param("list") List<DeviceVO> list);

    /**
     * 获取所有MAC
     */
    List<DeviceMacSnVO> selectMacSnList(@Param("query") DeviceQuery query);

    /**
     * 查询一个
     */
    DeviceVO selectOne(@Param("query") DeviceQuery query);

    int batchUpdateModel(DeviceBatchUpdateModelDTO dto);

    /**
     * 更新服务费
     */
    int updateServiceRate(DeviceVO data);

    /**
     * 续费时长
     */
    int renewalRentTime(@Param("deviceId") Long deviceId, @Param("seconds") long seconds);

    /**
     * 根据任何一个MAC查询
     */
    DeviceVO selectByAnyMac(@Param("mac") String mac);

    /**
     * 解绑代理商
     */
    int unbindAgent(Long deviceId);

    /**
     * 查询设备最大的代理商服务费
     */
    BigDecimal selectMaxAgentServiceRate(@Param("query") DeviceQuery query);

    /**
     * 绑定代理商
     * @param deviceId 设备ID
     * @param agentId 代理商ID
     * @param agentServiceRate 代理商设备服务费
     */
    int bindAgent(@Param("deviceId") Long deviceId,@Param("agentId") Long agentId, @Param("agentServiceRate") BigDecimal agentServiceRate);

    /**
     * 增加电量
     * @param deviceId
     * @param amount 电量（度）
     * @return
     */
    int addEle(@Param("deviceId") Long deviceId, @Param("amount") BigDecimal amount);

    /**
     * 记录读数
     */
    int initTotalEle(@Param("deviceId") Long deviceId);

}
