using Opc.Ua;
using Opc.Ua.Client;
using Serilog;

namespace ZB.MOM.WW.OtOpcUa.Client.Shared.Adapters;

/// <summary>
///     Production session factory that creates real OPC UA sessions.
/// </summary>
internal sealed class DefaultSessionFactory : ISessionFactory
{
    private static readonly ILogger Logger = Log.ForContext<DefaultSessionFactory>();

    /// <inheritdoc />
    public async Task<ISessionAdapter> CreateSessionAsync(
        ApplicationConfiguration config,
        EndpointDescription endpoint,
        string sessionName,
        uint sessionTimeoutMs,
        UserIdentity identity,
        CancellationToken ct)
    {
        var endpointConfig = EndpointConfiguration.Create(config);
        var configuredEndpoint = new ConfiguredEndpoint(null, endpoint, endpointConfig);

        var session = await Session.Create(
            config,
            configuredEndpoint,
            false,
            sessionName,
            sessionTimeoutMs,
            identity,
            null);

        Logger.Information("Session created: {SessionName} -> {EndpointUrl}", sessionName, endpoint.EndpointUrl);
        return new DefaultSessionAdapter(session);
    }
}