using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Team.FFFeederService.Interfaces
{
///
/// Feeder 管理服务接口。
/// 提供创建、查询、注销、移除和枚举 Feeder 的同步和异步操作。
/// 所有方法在实现中应保证线程安全并正确释放资源。
///
public interface IFeederService
{
///
/// 异步创建并注册一个新的 Feeder 实例。
///
/// Feeder 的唯一标识符 (GUID)。
/// Feeder 的编号索引(用于位置/槽位标识)。
/// Feeder 的显示名称。
/// Feeder 的网络 IP 地址或主机名。
/// Feeder 的网络端口号。
/// Feeder 的品牌枚举,用于创建特定实现。
/// 返回一个任务,任务结果为是否成功创建并注册 Feeder。
Task CreateFeederAsync(Guid id,int feederNo, string name, string ip, int port, FeederBrand feederBrand);
///
/// 同步创建并注册一个新的 Feeder 实例。
///
/// Feeder 的唯一标识符 (GUID)。
/// Feeder 的编号索引(用于位置/槽位标识)。
/// Feeder 的显示名称。
/// Feeder 的网络 IP 地址或主机名。
/// Feeder 的网络端口号。
/// Feeder 的品牌枚举,用于创建特定实现。
/// 是否成功创建并注册 Feeder。
bool CreateFeeder(Guid id, int feederNo, string name, string ip, int port, FeederBrand feederBrand);
///
/// 获取已注册的 Feeder(通过 id)。若未找到,可抛出或返回 null(由实现决定)。
///
/// 要获取的 Feeder 的唯一标识符。
/// 对应的 实例。
IVoiceCoilMotorFeeder GetFeeder(Guid id);
///
/// 异步获取已注册的 Feeder(通过 id)。
///
/// 要获取的 Feeder 的唯一标识符。
/// 一个任务,任务结果为对应的 实例。
Task GetFeederAsync(Guid id);
///
/// 通过 Feeder 编号(index)获取 Feeder。
///
/// Feeder 的编号索引。
/// 对应的 实例,若不存在返回 null(由实现决定)。
IVoiceCoilMotorFeeder GetFeederByIndex(int feederNo);
///
/// 异步通过 Feeder 编号(index)获取 Feeder。
///
/// Feeder 的编号索引。
/// 一个任务,任务结果为对应的 实例。
Task GetFeederByIndexAsync(int feederNo);
///
/// 注销并移除 Feeder(通过 id)。调用后应释放与该 Feeder 相关的所有资源并从管理集合中移除。
///
/// 要注销的 Feeder 的唯一标识符。
Task UnRegisterFeederAsync(Guid id);
///
/// 同步注销并移除 Feeder(通过 id)。调用后应释放与该 Feeder 相关的所有资源并从管理集合中移除。
///
/// 要注销的 Feeder 的唯一标识符。
void UnRegisterFeeder(Guid id);
///
/// 注销并移除 Feeder(通过 index)。调用后应释放与该 Feeder 相关的所有资源并从管理集合中移除。
///
/// 要注销的 Feeder 的编号索引。
Task UnRegisterFeederByIndexAsync(int feederNo);
///
/// 同步注销并移除 Feeder(通过 index)。
///
/// 要注销的 Feeder 的编号索引。
void UnRegisterFeederByIndex(int feederNo);
///
/// 获取所有已注册的 Feeder 的只读集合快照。
/// 返回的集合不应允许外部修改管理内部状态。
///
/// 只读集合,包含当前所有已注册的 Feeder 实例。
IReadOnlyCollection GetAllFeeders();
///
/// 异步获取所有已注册的 Feeder 的只读集合快照。
///
/// 一个任务,任务结果为只读集合,包含当前所有已注册的 Feeder 实例。
Task> GetAllFeedersAsync();
///
/// 尝试通过 id 获取 Feeder,避免抛出异常的安全访问方式。
///
/// 要查找的 Feeder 的唯一标识符。
/// 如果找到则输出对应的 Feeder 实例;否则为 null。
/// 如果找到则返回 true,否则返回 false。
bool TryGetFeeder(Guid id, out IVoiceCoilMotorFeeder feeder);
///
/// 异步尝试通过 id 获取 Feeder,返回一个包含查找结果的元组。
///
/// 要查找的 Feeder 的唯一标识符。
/// 一个任务,任务结果为 (found, feeder),found 表示是否找到,feeder 为对应实例或 null。
Task<(bool found, IVoiceCoilMotorFeeder feeder)> TryGetFeederAsync(Guid id);
///
/// 检查 Feeder 是否存在(通过 id)。
///
/// 要检查的 Feeder 的唯一标识符。
/// 存在则返回 true,否则返回 false。
bool ContainsFeeder(Guid id);
///
/// 异步检查 Feeder 是否存在(通过 id)。
///
/// 要检查的 Feeder 的唯一标识符。
/// 一个任务,任务结果为是否存在。
Task ContainsFeederAsync(Guid id);
///
/// 移除 Feeder(通过 id)并释放资源,返回是否成功移除。
/// 如果 Feeder 不存在则返回 false。
///
/// 要移除的 Feeder 的唯一标识符。
/// 是否成功移除并释放资源。
bool RemoveFeeder(Guid id);
///
/// 异步移除 Feeder(通过 id)并释放资源,返回是否成功移除。
///
/// 要移除的 Feeder 的唯一标识符。
/// 一个任务,任务结果为是否成功移除并释放资源。
Task RemoveFeederAsync(Guid id);
///
/// 移除并释放所有已注册的 Feeder。调用后管理集合应为空。
/// 实现应确保对每个 Feeder 的资源正确释放且保持原子性或可恢复性。
///
void RemoveAllFeeders();
///
/// 更新Feeder编号
///
///
///
void UpdateFeederNo(Guid id, int newFeederNo);
}
}