using System;
using System.Threading.Tasks;
using Jellyfin.Data.Dtos;
using Jellyfin.Data.Entities;
using Jellyfin.Data.Entities.Security;
using Jellyfin.Data.Events;
using Jellyfin.Data.Queries;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
namespace MediaBrowser.Controller.Devices;
///
/// Device manager interface.
///
public interface IDeviceManager
{
///
/// Event handler for updated device options.
///
event EventHandler>> DeviceOptionsUpdated;
///
/// Creates a new device.
///
/// The device to create.
/// A representing the creation of the device.
Task CreateDevice(Device device);
///
/// Saves the capabilities.
///
/// The device id.
/// The capabilities.
void SaveCapabilities(string deviceId, ClientCapabilities capabilities);
///
/// Gets the capabilities.
///
/// The device id.
/// ClientCapabilities.
ClientCapabilities GetCapabilities(string? deviceId);
///
/// Gets the device information.
///
/// The identifier.
/// DeviceInfoDto.
DeviceInfoDto? GetDevice(string id);
///
/// Gets devices based on the provided query.
///
/// The device query.
/// A representing the retrieval of the devices.
QueryResult GetDevices(DeviceQuery query);
///
/// Gets device infromation based on the provided query.
///
/// The device query.
/// A representing the retrieval of the device information.
QueryResult GetDeviceInfos(DeviceQuery query);
///
/// Gets the device information.
///
/// The user's id, or null.
/// IEnumerable<DeviceInfoDto>.
QueryResult GetDevicesForUser(Guid? userId);
///
/// Deletes a device.
///
/// The device.
/// A representing the deletion of the device.
Task DeleteDevice(Device device);
///
/// Updates a device.
///
/// The device.
/// A representing the update of the device.
Task UpdateDevice(Device device);
///
/// Determines whether this instance [can access device] the specified user identifier.
///
/// The user to test.
/// The device id to test.
/// Whether the user can access the device.
bool CanAccessDevice(User user, string deviceId);
///
/// Updates the options of a device.
///
/// The device id.
/// The device name.
/// A representing the update of the device options.
Task UpdateDeviceOptions(string deviceId, string? deviceName);
///
/// Gets the options of a device.
///
/// The device id.
/// of the device.
DeviceOptionsDto? GetDeviceOptions(string deviceId);
///
/// Gets the dto for client capabilites.
///
/// The client capabilities.
/// of the device.
ClientCapabilitiesDto ToClientCapabilitiesDto(ClientCapabilities capabilities);
}