namespace ZB.MOM.WW.MxGateway.Server.Configuration;

public sealed class EventOptions
{
    /// <summary>
    /// Gets the event queue capacity.
    /// </summary>
    public int QueueCapacity { get; init; } = 10_000;

    /// <summary>
    /// Gets the backpressure policy for event queue overflow.
    /// </summary>
    public EventBackpressurePolicy BackpressurePolicy { get; init; } = EventBackpressurePolicy.FailFast;

    /// <summary>
    ///     Gets the maximum number of events retained in the per-session replay ring buffer
    ///     used to re-deliver events a returning subscriber missed (reconnect/reattach).
    ///     When the buffer exceeds this count the oldest retained events are evicted first.
    ///     A value of <c>0</c> disables replay retention entirely.
    /// </summary>
    public int ReplayBufferCapacity { get; init; } = 1024;

    /// <summary>
    ///     Gets the maximum age, in seconds, of an event retained in the per-session replay
    ///     ring buffer. Entries older than this are evicted regardless of capacity. A value
    ///     of <c>0</c> disables age-based eviction (only <see cref="ReplayBufferCapacity"/>
    ///     bounds the buffer).
    /// </summary>
    public double ReplayRetentionSeconds { get; init; } = 300;

    /// <summary>
    ///     Gets the maximum <c>total_length</c> a sparse-array write may declare before the
    ///     gateway rejects it with <c>InvalidArgument</c>, enforced in
    ///     <see cref="Sessions.SparseArrayExpander"/> before the full array is materialized.
    ///     Guards against a single write forcing a multi-GB allocation. The default of
    ///     1,000,000 elements is far above any realistic MXAccess array write yet well below
    ///     the frame-size ceiling.
    /// </summary>
    public int MaxSparseArrayLength { get; init; } = 1_000_000;
}
