using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TeamAAS_VP.Models;
namespace TeamAAS_VP.Interfaces
{
///
/// 提供相机生命周期管理的接口,包括创建、获取及注销相机实例。
/// 实现者应保证线程安全,并在 中释放所有已注册相机的资源。
///
public interface ICameraService : IDisposable
{
///
/// 异步创建并注册一个相机实例。
///
/// 相机唯一标识符(Guid)。
/// 用于创建相机的配置信息,不能为空。
/// 返回一个任务,任务结果为 true 表示创建并注册成功,false 表示已存在或创建失败。
Task CreateCameraAsync(Guid id, CameraInfo cameraInfo);
///
/// 同步创建并注册一个相机实例。
///
/// 相机唯一标识符(Guid)。
/// 用于创建相机的配置信息,不能为空。
/// 如果创建并注册成功则返回 true;如果已存在或创建失败则返回 false。
bool CreateCamera(Guid id, CameraInfo cameraInfo);
///
/// 根据标识符获取已注册的相机实例(同步)。
///
/// 相机唯一标识符(Guid)。
/// 返回对应的 实例;若未找到,返回 null(实现者应在文档中明确 null 语义)。
ICamera GetCamera(Guid id);
///
/// 根据标识符获取已注册的相机实例(异步)。
///
/// 相机唯一标识符(Guid)。
/// 返回一个任务,其结果为对应的 实例;若未找到,结果为 null。
Task GetCameraAsync(Guid id);
///
/// 获取当前所有已注册相机的只读集合(同步快照)。
///
/// 返回一个只读集合,包含当前已注册的所有 实例。
IReadOnlyCollection GetAllCameras();
///
/// 获取当前所有已注册相机的只读集合(异步快照)。
///
/// 返回一个任务,其结果为当前已注册的所有 实例的只读集合。
Task> GetAllCamerasAsync();
///
/// 尝试根据标识符获取相机(同步)。
///
/// 相机唯一标识符(Guid)。
/// 当返回值为 true 时,输出对应的 实例;否则为 null。
/// 如果找到则返回 true,否则返回 false。
bool TryGetCamera(Guid id, out ICamera camera);
///
/// 尝试根据标识符获取相机(异步)。
///
/// 相机唯一标识符(Guid)。
///
/// 返回一个任务,任务结果为一个元组:
/// - found: 是否找到相机;
/// - camera: 如果 found 为 true,则为对应的 实例;否则为 null。
///
Task<(bool found, ICamera camera)> TryGetCameraAsync(Guid id);
///
/// 检查是否包含指定标识符的注册相机(同步)。
///
/// 相机唯一标识符(Guid)。
/// 如果已注册则返回 true;否则返回 false。
bool ContainsCamera(Guid id);
///
/// 检查是否包含指定标识符的注册相机(异步)。
///
/// 相机唯一标识符(Guid)。
/// 返回一个任务,其结果为是否已注册该相机。
Task ContainsCameraAsync(Guid id);
///
/// 从注册表中移除并注销指定标识符的相机(同步)。
/// 实现者应在移除时妥善释放相机占用的资源或根据语义选择仅反注册。
///
/// 相机唯一标识符(Guid)。
/// 如果成功移除则返回 true;如果未找到则返回 false。
bool RemoveCamera(Guid id);
///
/// 从注册表中移除并注销指定标识符的相机(异步)。
///
/// 相机唯一标识符(Guid)。
/// 返回一个任务,任务结果为是否成功移除。
Task RemoveCameraAsync(Guid id);
///
/// 异步反注册指定标识符的相机(不一定释放底层资源,具体语义由实现者决定并在实现文档中说明)。
///
/// 相机唯一标识符(Guid)。
/// 异步任务,完成时表示已反注册或确认不存在。
Task UnRegisterCameraAsync(Guid id);
///
/// 同步反注册指定标识符的相机(不一定释放底层资源,具体语义由实现者决定并在实现文档中说明)。
///
/// 相机唯一标识符(Guid)。
void UnRegisterCamera(Guid id);
///
/// 根据物理或逻辑编号获取相机(同步)。
///
/// 相机编号(通常为设备顺序号或配置中的数字索引)。
/// 返回对应的 实例;若未找到,返回 null。
ICamera GetCameraByNumber(int number);
///
/// 根据物理或逻辑编号获取相机(异步)。
///
/// 相机编号(通常为设备顺序号或配置中的数字索引)。
/// 返回一个任务,其结果为对应的 实例;若未找到,结果为 null。
Task GetCameraByNumberAsync(int number);
///
/// 异步按编号反注册相机。
///
/// 相机编号。
/// 异步任务,完成时表示已按编号反注册或确认不存在。
Task UnRegisterCameraByNumberAsync(int number);
///
/// 同步按编号反注册相机。
///
/// 相机编号。
void UnRegisterCameraByNumber(int number);
///
/// 移除所有相机
///
void RemoveAllCameras();
///
/// 初始化所有相机
///
///
///
(bool IsSucceed, string Message) InitializeAllCameras(CameraInfo[] cameras);
///
/// 初始化所有相机(异步)
///
///
///
Task<(bool IsSucceed, string Message)> InitializeAllCamerasAsync(CameraInfo[] cameras);
///
/// 更新相机编号
///
///
///
void UpdateCameraNumber(Guid id, int newNumber);
}
}