using System.Collections.Concurrent;
namespace ETTerms.PduMcp;
///
/// Process-wide registry of connected PDUs, keyed by IP. The MCP server is long-lived,
/// so connections established by pdu_connect persist across tool calls.
///
public sealed class PduRegistry
{
public static readonly PduRegistry Instance = new();
/// iPoMan II/III outlet count.
public const int PortCount = 12;
private readonly ConcurrentDictionary _pdus = new(StringComparer.OrdinalIgnoreCase);
public PduController GetOrAdd(string ip) =>
_pdus.GetOrAdd(ip.Trim(), static k => new PduController(k));
public bool TryGet(string ip, out PduController pdu) =>
_pdus.TryGetValue(ip.Trim(), out pdu!);
public bool Remove(string ip)
{
if (_pdus.TryRemove(ip.Trim(), out var pdu)) { pdu.Dispose(); return true; }
return false;
}
public IReadOnlyCollection ConnectedIps => _pdus.Keys.ToArray();
}