namespace ZB.MOM.WW.OtOpcUa.Driver.AbLegacy;

/// <summary>
///     Wire-layer abstraction over a single PCCC tag. Mirrors <c>IAbCipTagRuntime</c>'s shape so
///     the same test-fake pattern applies; the only meaningful difference is the protocol layer
///     underneath (<c>ab_pccc</c> vs <c>ab_eip</c>).
/// </summary>
public interface IAbLegacyTagRuntime : IDisposable
{
    Task InitializeAsync(CancellationToken cancellationToken);
    Task ReadAsync(CancellationToken cancellationToken);
    Task WriteAsync(CancellationToken cancellationToken);
    int GetStatus();
    object? DecodeValue(AbLegacyDataType type, int? bitIndex);
    void EncodeValue(AbLegacyDataType type, int? bitIndex, object? value);
}

public interface IAbLegacyTagFactory
{
    IAbLegacyTagRuntime Create(AbLegacyTagCreateParams createParams);
}

public sealed record AbLegacyTagCreateParams(
    string Gateway,
    int Port,
    string CipPath,
    string LibplctagPlcAttribute,
    string TagName,
    TimeSpan Timeout);
