using CliFx.Attributes;
using ZB.MOM.WW.OtOpcUa.Driver.AbLegacy.PlcFamilies;
using ZB.MOM.WW.OtOpcUa.Driver.Cli.Common;

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

/// <summary>
///     Base for every AB Legacy CLI command. Carries the PCCC-specific endpoint options
///     (<c>--gateway</c> + <c>--plc-type</c>) on top of <see cref="DriverCommandBase"/>'s
///     shared verbose + timeout + logging helpers.
/// </summary>
public abstract class AbLegacyCommandBase : DriverCommandBase
{
    [CommandOption("gateway", 'g', Description =
        "Canonical AB Legacy gateway: ab://host[:port]/cip-path. Port defaults to 44818. " +
        "cip-path depends on the family: SLC 5/05 + PLC-5 typically '1,0'; MicroLogix " +
        "1100/1400 takes an empty path (direct EIP, no backplane).",
        IsRequired = true)]
    public string Gateway { get; init; } = default!;

    [CommandOption("plc-type", 'P', Description =
        "Slc500 / MicroLogix / Plc5 / LogixPccc (default Slc500).")]
    public AbLegacyPlcFamily PlcType { get; init; } = AbLegacyPlcFamily.Slc500;

    [CommandOption("timeout-ms", Description = "Per-operation timeout in ms (default 5000).")]
    public int TimeoutMs { get; init; } = 5000;

    /// <inheritdoc />
    public override TimeSpan Timeout
    {
        get => TimeSpan.FromMilliseconds(TimeoutMs);
        init { /* driven by TimeoutMs */ }
    }

    /// <summary>
    ///     Build an <see cref="AbLegacyDriverOptions"/> with the device + tag list a subclass
    ///     supplies. Probe disabled for CLI one-shot runs.
    /// </summary>
    protected AbLegacyDriverOptions BuildOptions(IReadOnlyList<AbLegacyTagDefinition> tags) => new()
    {
        Devices = [new AbLegacyDeviceOptions(
            HostAddress: Gateway,
            PlcFamily: PlcType,
            DeviceName: $"cli-{PlcType}")],
        Tags = tags,
        Timeout = Timeout,
        Probe = new AbLegacyProbeOptions { Enabled = false },
    };

    protected string DriverInstanceId => $"ablegacy-cli-{Gateway}";
}
