using ZB.MOM.WW.OtOpcUa.Commons.Messages.Admin;

namespace ZB.MOM.WW.OtOpcUa.Commons.Interfaces;

/// <summary>
/// Cluster-singleton-proxy client for the <c>AdminOperationsActor</c>. The Blazor UI calls
/// this from any host (admin or driver role); the proxy routes the request to whichever node
/// holds the admin singleton.
/// </summary>
public interface IAdminOperationsClient
{
    /// <summary>Starts a new deployment on the cluster-singleton admin operations actor.</summary>
    /// <param name="createdBy">The user or system identifier triggering the deployment.</param>
    /// <param name="ct">The cancellation token.</param>
    /// <returns>A task representing the asynchronous operation containing the deployment start result.</returns>
    Task<StartDeploymentResult> StartDeploymentAsync(string createdBy, CancellationToken ct);

    /// <summary>
    ///     Generic Ask: forwards <paramref name="message"/> to the AdminOperationsActor
    ///     cluster-singleton proxy and awaits a reply of type <typeparamref name="T"/>.
    ///     The caller is responsible for applying any outer timeout via <paramref name="ct"/>.
    /// </summary>
    /// <typeparam name="T">Expected reply type.</typeparam>
    /// <param name="message">The message to send.</param>
    /// <param name="ct">Cancellation token (caller-controlled timeout).</param>
    Task<T> AskAsync<T>(object message, CancellationToken ct);
}
