namespace ZB.MOM.WW.ScadaBridge.StoreAndForward;

/// <summary>
/// WP-9/10: Configuration options for the Store-and-Forward Engine.
/// </summary>
public class StoreAndForwardOptions
{
    /// <summary>Path to the SQLite database for S&amp;F message persistence.</summary>
    public string SqliteDbPath { get; set; } = "./data/store-and-forward.db";

    /// <summary>WP-11: Whether to replicate buffer operations to standby node.</summary>
    public bool ReplicationEnabled { get; set; } = true;

    /// <summary>WP-10: Default retry interval for messages without per-source settings.</summary>
    public TimeSpan DefaultRetryInterval { get; set; } = TimeSpan.FromSeconds(30);

    /// <summary>
    /// WP-10: Default maximum retry count before parking. Applied when an
    /// <c>EnqueueAsync</c> caller does not pass an explicit <c>maxRetries</c>.
    /// <para>
    /// <b>StoreAndForward-019:</b> this default is enforced uniformly across
    /// every category, including <see cref="Commons.Types.Enums.StoreAndForwardCategory.Notification"/>:
    /// once the buffered message's retry count reaches this cap the engine
    /// parks the row. The Component-StoreAndForward.md "notifications do not
    /// park" wording reflects the operational <i>intent</i> when central is
    /// reachable on the normal cadence; under a sustained central outage that
    /// exceeds <c>DefaultMaxRetries × forward-interval</c> a buffered
    /// notification <i>will</i> park and surface in the parked-message UI,
    /// matching the rest of the system's bounded-retry-then-park behaviour.
    /// Callers that genuinely require unbounded retry must pass
    /// <c>maxRetries: 0</c> on <c>EnqueueAsync</c> (the documented "no limit"
    /// escape hatch — see <c>StoreAndForwardService.EnqueueAsync</c>).
    /// </para>
    /// </summary>
    public int DefaultMaxRetries { get; set; } = 50;

    /// <summary>WP-10: Interval for the background retry timer sweep.</summary>
    public TimeSpan RetryTimerInterval { get; set; } = TimeSpan.FromSeconds(10);
}
