using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TeamAAS_VP.Models;
namespace TeamAAS_VP.Interfaces
{
///
/// 提供 PLC 生命周期管理的接口,包括创建、获取、初始化及注销 PLC 实例。
///
public interface IPlcService : IDisposable
{
///
/// 异步创建并注册一个新的 PLC 实例。
///
/// PLC 唯一标识。
/// PLC 的配置信息。
/// 创建是否成功。
Task CreatePlcAsync(Guid id, PlcInfo plcInfo);
///
/// 同步创建并注册一个新的 PLC 实例。
///
/// PLC 唯一标识。
/// PLC 的配置信息。
/// 创建是否成功。
bool CreatePlc(Guid id, PlcInfo plcInfo);
///
/// 初始化所有PLC实例(同步)。
///
///
///
(bool IsSucceed, string Message) InitializePlc(PlcInfo[] plcs);
///
/// 初始化所有PLC实例(异步)。
///
///
///
Task<(bool IsSucceed, string Message)> InitializePlcAsync(PlcInfo[] plcs);
///
/// 获取指定 ID 的 PLC 实例(同步),如果不存在可返回 null 或抛出异常,视实现而定。
///
/// PLC 唯一标识。
/// 对应的 实例。
IPlc GetPlc(Guid id);
///
/// 异步获取指定 ID 的 PLC 实例。
///
/// PLC 唯一标识。
/// 对应的 实例的任务。
Task GetPlcAsync(Guid id);
///
/// 获取当前所有已注册的 PLC(只读集合,同步)。
///
/// 只读的 PLC 实例集合。
IReadOnlyCollection GetAllPlcs();
///
/// 异步获取当前所有已注册的 PLC(只读集合)。
///
/// 只读的 PLC 实例集合的任务。
Task> GetAllPlcsAsync();
///
/// 尝试根据 ID 获取 PLC(同步),若存在则返回 true 并通过 out 参数返回实例。
///
/// PLC 唯一标识。
/// 输出的 PLC 实例(若找到)。
/// 是否找到。
bool TryGetPlc(Guid id, out IPlc plc);
///
/// 尝试根据 ID 异步获取 PLC,返回是否找到及实例的元组。
///
/// PLC 唯一标识。
/// 包含是否找到与实例的元组。
Task<(bool found, IPlc plc)> TryGetPlcAsync(Guid id);
///
/// 判断是否包含指定 ID 的 PLC(同步)。
///
/// PLC 唯一标识。
/// 是否包含。
bool ContainsPlc(Guid id);
///
/// 判断是否包含指定 ID 的 PLC(异步)。
///
/// PLC 唯一标识。
/// 是否包含的任务。
Task ContainsPlcAsync(Guid id);
///
/// 移除指定 ID 的 PLC(同步),并释放其资源。
///
/// PLC 唯一标识。
/// 移除是否成功。
bool RemovePlc(Guid id);
///
/// 异步移除指定 ID 的 PLC,并释放其资源。
///
/// PLC 唯一标识。
/// 移除是否成功的任务。
Task RemovePlcAsync(Guid id);
///
/// 移除所有已注册的 PLC(同步),并释放相关资源。
///
/// 是否全部成功移除;若部分失败则返回 false。
bool RemoveAllPlcs();
///
/// 异步移除所有已注册的 PLC,并释放相关资源。
///
/// 是否全部成功移除的任务;若部分失败则返回 false。
Task RemoveAllPlcsAsync();
///
/// 异步注销指定的 PLC(例如注销事件、断开连接等),不一定会立即从集合中移除,具体行为由实现决定。
///
/// PLC 唯一标识。
/// 任务。
Task UnRegisterPlcAsync(Guid id);
///
/// 同步注销指定的 PLC(例如注销事件、断开连接等),不一定会立即从集合中移除,具体行为由实现决定。
///
/// PLC 唯一标识。
void UnRegisterPlc(Guid id);
///
/// 根据 PLC 编号获取 PLC 实例(同步)。
///
/// PLC 编号。
/// 对应的 实例。
IPlc GetPlcByNumber(int number);
///
/// 根据 PLC 编号异步获取 PLC 实例。
///
/// PLC 编号。
/// 对应的 实例的任务。
Task GetPlcByNumberAsync(int number);
///
/// 根据 PLC 编号异步注销 PLC(例如注销事件、断开连接等)。
///
/// PLC 编号。
/// 任务。
Task UnRegisterPlcByNumberAsync(int number);
///
/// 根据 PLC 编号同步注销 PLC(例如注销事件、断开连接等)。
///
/// PLC 编号。
void UnRegisterPlcByNumber(int number);
///
/// 更新PLC编号
///
///
///
void UpdatePlcNumber(Guid id, int newNumber);
}
}