using System.Text.Json.Nodes;
using OpenAuth.WebApi.CloudSdk;

namespace OpenAuth.App.ServiceApp.DjiCloud.Service;

/// <summary>
    /// 设备服务接口，定义了设备管理相关的操作。
    /// </summary>
    public interface IDeviceService
    {
        /// <summary>
        /// 飞行器离线。
        /// </summary>
        /// <param name="deviceSn">飞行器序列号</param>
        void SubDeviceOffline(string deviceSn);

        /// <summary>
        /// 网关离线。
        /// </summary>
        /// <param name="gatewaySn">网关序列号</param>
        void GatewayOffline(string gatewaySn);

        /// <summary>
        /// 当网关上线时订阅网关主题，并取消订阅子设备主题。
        /// </summary>
        /// <param name="gateway">网关管理对象</param>
        void GatewayOnlineSubscribeTopic(GatewayManager gateway);

        /// <summary>
        /// 当无人机上线时订阅网关和子设备主题。
        /// </summary>
        /// <param name="gateway">网关管理对象</param>
        void SubDeviceOnlineSubscribeTopic(GatewayManager gateway);

        /// <summary>
        /// 当网关设备下线时，取消订阅网关和子设备的主题。
        /// </summary>
        /// <param name="gateway">网关管理对象</param>
        void OfflineUnsubscribeTopic(GatewayManager gateway);

        /// <summary>
        /// 根据不同查询条件获取设备数据。
        /// </summary>
        /// <param name="param">查询参数</param>
        /// <returns>设备列表</returns>
      //  List<DeviceDTO> GetDevicesByParams(DeviceQueryParam param);

        /// <summary>
        /// 获取该工作区所有设备的拓扑信息。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <returns>设备列表</returns>
        List<DeviceDTO> GetDevicesTopoForWeb(string workspaceId);

        /// <summary>
        /// 设置无人机的遥控器和负载信息。
        /// </summary>
        /// <param name="device">设备对象</param>
        void SpliceDeviceTopo(DeviceDTO device);

        /// <summary>
        /// 根据设备 SN 查询设备信息。
        /// </summary>
        /// <param name="sn">设备序列号</param>
        /// <returns>拓扑设备 DTO</returns>
      //  Optional<TopologyDeviceDTO> GetDeviceTopoForPilot(string sn);

        /// <summary>
        /// 将单个设备信息转换为拓扑对象。
        /// </summary>
        /// <param name="device">设备对象</param>
        /// <returns>拓扑设备 DTO</returns>
       // TopologyDeviceDTO DeviceConvertToTopologyDTO(DeviceDTO device);

        /// <summary>
        /// 服务器接收到同一工作区内的任何设备上下线及拓扑更新请求时，
        /// 会通过 WebSocket 向 PILOT 广播推送设备上下线及拓扑更新消息，
        /// PILOT 收到推送后重新获取设备拓扑列表。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="deviceSn">设备序列号</param>
        void PushDeviceOfflineTopo(string workspaceId, string deviceSn);

        /// <summary>
        /// 服务器接收到同一工作区内的任何设备上下线及拓扑更新请求时，
        /// 会通过 WebSocket 向 PILOT 广播推送设备上下线及拓扑更新消息，
        /// PILOT 收到推送后重新获取设备拓扑列表。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="gatewaySn">网关序列号</param>
        /// <param name="deviceSn">设备序列号</param>
        void PushDeviceOnlineTopo(string workspaceId, string gatewaySn, string deviceSn);

        /// <summary>
        /// 更新设备信息。
        /// </summary>
        /// <param name="deviceDTO">设备 DTO</param>
        /// <returns>是否更新成功</returns>
        bool UpdateDevice(DeviceDTO deviceDTO);

        /// <summary>
        /// 绑定设备到组织和人员。
        /// </summary>
        /// <param name="device">设备 DTO</param>
        /// <returns>是否绑定成功</returns>
        bool BindDevice(DeviceDTO device);

        /// <summary>
        /// 获取工作区内已绑定设备列表。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="page">页码</param>
        /// <param name="pageSize">每页大小</param>
        /// <param name="domain">域</param>
        /// <returns>分页设备数据</returns>
      //  PaginationData<DeviceDTO> GetBoundDevicesWithDomain(string workspaceId, long page, long pageSize, int domain);

        /// <summary>
        /// 解除设备绑定。
        /// </summary>
        /// <param name="deviceSn">设备序列号</param>
        void UnbindDevice(string deviceSn);

        /// <summary>
        /// 根据设备序列号获取设备信息。
        /// </summary>
        /// <param name="sn">设备序列号</param>
        /// <returns>设备 DTO</returns>
     //   Optional<DeviceDTO> GetDeviceBySn(string sn);

        /// <summary>
        /// 创建设备固件升级任务。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="upgradeDTOS">升级 DTO 列表</param>
        /// <returns>HTTP 响应结果</returns>
     //   HttpResultResponse CreateDeviceOtaJob(string workspaceId, List<DeviceFirmwareUpgradeDTO> upgradeDTOS);

        /// <summary>
        /// 设置无人机属性参数。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="dockSn">停机坞序列号</param>
        /// <param name="param">JSON 参数节点</param>
        /// <returns>受影响记录数</returns>
        int DevicePropertySet(string workspaceId, string dockSn, JsonNode param);

        /// <summary>
        /// 检查停机坞的工作模式。
        /// </summary>
        /// <param name="dockSn">停机坞序列号</param>
        /// <returns>停机坞工作模式枚举</returns>
       // DockModeCodeEnum GetDockMode(string dockSn);

        /// <summary>
        /// 查询飞行器的工作模式。
        /// </summary>
        /// <param name="deviceSn">设备序列号</param>
        /// <returns>飞行器工作模式枚举</returns>
     //   DroneModeCodeEnum GetDeviceMode(string deviceSn);

        /// <summary>
        /// 检查停机坞是否处于 DRC 模式。
        /// </summary>
        /// <param name="dockSn">停机坞序列号</param>
        /// <returns>是否处于 DRC 模式</returns>
        bool CheckDockDrcMode(string dockSn);

        /// <summary>
        /// 检查设备是否有飞行控制权限。
        /// </summary>
        /// <param name="gatewaySn">网关序列号</param>
        /// <returns>是否有飞行控制权限</returns>
        bool CheckAuthorityFlight(string gatewaySn);

        /// <summary>
        /// 保存设备信息。
        /// </summary>
        /// <param name="device">设备 DTO</param>
        /// <returns>受影响记录数</returns>
        int SaveDevice(DeviceDTO device);

        /// <summary>
        /// 保存或更新设备信息。
        /// </summary>
        /// <param name="device">设备 DTO</param>
        /// <returns>是否保存或更新成功</returns>
        bool SaveOrUpdateDevice(DeviceDTO device);

        /// <summary>
        /// 推送 OSD 数据给 Pilot。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="sn">设备序列号</param>
        /// <param name="data">OSD 数据</param>
      //  void PushOsdDataToPilot(string workspaceId, string sn, DeviceOsdHost data);

        /// <summary>
        /// 推送 OSD 数据给 Web。
        /// </summary>
        /// <param name="workspaceId">工作区 ID</param>
        /// <param name="codeEnum">业务代码枚举</param>
        /// <param name="sn">设备序列号</param>
        /// <param name="data">OSD 数据</param>
       // void PushOsdDataToWeb(string workspaceId, BizCodeEnum codeEnum, string sn, object data);

        /// <summary>
        /// 更新飞行控制信息。
        /// </summary>
        /// <param name="gateway">网关设备 DTO</param>
        /// <param name="controlSource">控制源枚举</param>
        //void UpdateFlightControl(DeviceDTO gateway, ControlSourceEnum controlSource);
    }

