package com.red.circle.other.app.inner.service.user.device;

import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.inner.model.cmd.user.device.ArchiveDeviceQryCmd;
import com.red.circle.other.inner.model.cmd.user.device.DeviceRegisterQuantityQryCmd;
import com.red.circle.other.inner.model.cmd.user.device.PageLatestMobileDeviceQryCmd;
import com.red.circle.other.inner.model.dto.user.UserLatestDeviceAssociatedDTO;
import com.red.circle.other.inner.model.dto.user.UserLatestMobileDeviceHistoryDTO;
import com.red.circle.other.inner.model.dto.user.device.ArchiveDeviceDTO;
import com.red.circle.other.inner.model.dto.user.device.DeviceRegisterQuantityDTO;
import com.red.circle.other.inner.model.dto.user.device.LatestMobileDeviceDTO;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 注册设备相关服务.
 *
 * @author pengliang on 2023/5/24
 */
public interface RegisterDeviceClientService {

  /**
   * 是否存在设备.
   *
   * @param deviceNo 设备号
   * @return true 存在，false 不存在
   */
  Boolean existsDevice(String deviceNo, String sysOrigin);

  /**
   * 添加设备.
   */
  void addDeviceNo(String deviceNo, String sysOrigin);

  /**
   * 分页查询设备
   */
  PageResult<ArchiveDeviceDTO> pageList(ArchiveDeviceQryCmd query);

  /**
   * 移除封禁设备.
   *
   * @param deviceNo 设备.
   */
  void removeDeviceNo(String deviceNo, String sysOrigin);

  /**
   * 删除设备
   */
  void delByDeviceNo(Long id);

  /**
   * 上传最新设备.
   */
  void uploadLatestDeviceNo(LatestMobileDeviceDTO cmd);

  /**
   * 获取用户设备号.
   */
  String getImeiByUserId(Long userId);

  /**
   * 获取设备注册用户.
   */
  List<Long> listUserIdByImei(String imei, String sysOrigin);

  List<UserLatestMobileDeviceHistoryDTO> listByImei(String imei, String sysOrigin);

  /**
   * 获取用户最新登记设备关联用户id.
   */
  List<Long> listLatestAssociationUserIds(Long userId);

  /**
   * 根据用户id获得关联ip与设备的用户id集合.
   *
   * @param userId 用户ID
   * @return 用户ID
   */
  Set<Long> getIpOrImeiUserId(Long userId);


  /**
   * 根据userId获得设备信息
   *
   * @param userId 用户id
   * @return 设备信息
   */
  UserLatestDeviceAssociatedDTO getDeviceByUserId(Long userId);

  /**
   * 获取设备最新信息分页结果
   */
  PageResult<UserLatestMobileDeviceHistoryDTO> pageLatestMobileDevice(
      PageLatestMobileDeviceQryCmd query);

  /**
   * 获取注册设备数量映射.
   */
  Map<String, DeviceRegisterQuantityDTO> mapDeviceRegisterQuantity(
      DeviceRegisterQuantityQryCmd cmd);

  /**
   * 设备号
   *
   * @param userIds 用户
   * @return 设备信息
   */
  Map<Long, String> mapImeiByIds(Set<Long> userIds);

  /**
   * 获取用户设备指纹
   * 
   * @param userId 用户ID
   * @return 设备指纹字符串
   */
  String getDeviceFingerprintByUserId(Long userId);

  /**
   * 检查当前用户的设备指纹是否与其他主播用户共享
   * 
   * @param userId 用户ID
   * @return true-存在共享设备的主播用户, false-不存在
   */
  Boolean checkDeviceFingerprintHasAnchor(Long userId);
}
