// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace Microsoft.AspNetCore.Components.Server;

/// <summary>
/// Options to configure circuit handler for server-side Blazor
/// </summary>
public sealed class CircuitOptions
{
    /// <summary>
    /// Gets or sets a value that determines the maximum number of disconnected circuit state details
    /// are retained by the server.
    /// <para>
    /// When a client disconnects, ASP.NET Core Components attempts to retain state on the server for an
    /// interval. This allows the client to re-establish a connection to the existing circuit on the server
    /// without losing any state in the event of transient connection issues.
    /// </para>
    /// <para>
    /// This value determines the maximum number of circuit states retained by the server.
    /// <seealso cref="DisconnectedCircuitRetentionPeriod"/>
    /// </para>
    /// </summary>
    /// <value>
    /// Defaults to <c>100</c>.
    /// </value>
    public int DisconnectedCircuitMaxRetained { get; set; } = 100;

    /// <summary>
    /// Gets or sets a value that determines the maximum duration state for a disconnected circuit is
    /// retained on the server.
    /// <para>
    /// When a client disconnects, ASP.NET Core Components attempts to retain state on the server for an
    /// interval. This allows the client to re-establish a connection to the existing circuit on the server
    /// without losing any state in the event of transient connection issues.
    /// </para>
    /// <para>
    /// This value determines the maximum duration circuit state is retained by the server before being evicted.
    /// <seealso cref="DisconnectedCircuitMaxRetained"/>
    /// </para>
    /// </summary>
    /// <value>
    /// Defaults to <c>3 minutes</c>.
    /// </value>
    public TimeSpan DisconnectedCircuitRetentionPeriod { get; set; } = TimeSpan.FromMinutes(3);

    /// <summary>
    /// Gets or sets a value that determines whether or not to send detailed exception messages to JavaScript when an unhandled exception
    /// happens on the circuit or when a .NET method invocation through JS interop results in an exception.
    /// </summary>
    /// <remarks>
    /// This value should only be turned on in development scenarios as turning it on in production might result in the leak of
    /// sensitive information to untrusted parties.
    /// </remarks>
    /// <value>Defaults to <c>false</c>.</value>
    public bool DetailedErrors { get; set; }

    /// <summary>
    /// Gets or sets a value that indicates how long the server will wait before timing out an asynchronous JavaScript function invocation.
    /// </summary>
    /// <value>
    /// Defaults to <c>1 minute</c>.
    /// </value>
    public TimeSpan JSInteropDefaultCallTimeout { get; set; } = TimeSpan.FromMinutes(1);

    /// <summary>
    /// Gets or sets the maximum number of render batches that a circuit will buffer until an acknowledgement for the batch is
    /// received.
    /// </summary>
    /// <remarks>
    /// When the limit of buffered render batches is reached components will stop rendering and will wait until either the
    /// circuit is disconnected and disposed or at least one batch gets acknowledged.
    /// </remarks>
    /// <value>
    /// Defaults to <c>10</c>.</value>
    public int MaxBufferedUnacknowledgedRenderBatches { get; set; } = 10;

    /// <summary>
    /// Gets options for root components within the circuit.
    /// </summary>
    public CircuitRootComponentOptions RootComponents { get; } = new CircuitRootComponentOptions();

    internal IList<string> JavaScriptInitializers { get; } = new List<string>();
}
