using CliFx.Attributes;
using CliFx.Infrastructure;
using ZB.MOM.WW.OtOpcUa.Client.Shared;

namespace ZB.MOM.WW.OtOpcUa.Client.CLI.Commands;

[Command("connect", Description = "Test connection to an OPC UA server")]
public class ConnectCommand : CommandBase
{
    /// <summary>
    /// Creates the connectivity test command used to verify endpoint reachability and negotiated security settings.
    /// </summary>
    /// <param name="factory">The factory that creates the shared client service for the command run.</param>
    public ConnectCommand(IOpcUaClientServiceFactory factory) : base(factory)
    {
    }

    /// <inheritdoc />
    public override async ValueTask ExecuteAsync(IConsole console)
    {
        ConfigureLogging();
        IOpcUaClientService? service = null;
        try
        {
            (service, var info) = await CreateServiceAndConnectAsync(console.RegisterCancellationHandler());

            await console.Output.WriteLineAsync($"Connected to: {info.EndpointUrl}");
            await console.Output.WriteLineAsync($"Server: {info.ServerName}");
            await console.Output.WriteLineAsync($"Security Mode: {info.SecurityMode}");
            await console.Output.WriteLineAsync($"Security Policy: {info.SecurityPolicyUri}");
            await console.Output.WriteLineAsync("Connection successful.");
        }
        finally
        {
            if (service != null)
            {
                await service.DisconnectAsync();
                service.Dispose();
            }
        }
    }
}
