namespace ZB.MOM.WW.ScadaBridge.StoreAndForward;
///
/// Configuration options for the Store-and-Forward Engine.
///
public class StoreAndForwardOptions
{
///
/// Path to the legacy standalone store-and-forward SQLite file. Migration-only.
/// The buffer itself lives in the consolidated LocalDb database (LocalDb:Path)
/// as of LocalDb Phase 2; this path is read once at boot by
/// SiteLocalDbLegacyMigrator to drain a pre-Phase-2 file, and is otherwise
/// unused. A node that has already migrated may leave it set or unset.
///
public string SqliteDbPath { get; set; } = "./data/store-and-forward.db";
/// Default retry interval for messages without per-source settings.
public TimeSpan DefaultRetryInterval { get; set; } = TimeSpan.FromSeconds(30);
///
/// Default maximum retry count before parking. Applied when an
/// EnqueueAsync caller does not pass an explicit maxRetries.
///
public int DefaultMaxRetries { get; set; } = 50;
/// Interval for the background retry timer sweep.
public TimeSpan RetryTimerInterval { get; set; } = TimeSpan.FromSeconds(10);
///
/// Maximum due rows loaded per retry sweep. Bounds sweep memory and duration
/// under backlog; the remainder is picked up on the next tick (10 s).
/// 0 = unlimited (legacy).
///
public int SweepBatchLimit { get; set; } = 500;
///
/// Max (category, target) lanes delivered concurrently per sweep.
/// 1 = legacy serial. Within a lane delivery stays sequential (per-target FIFO).
///
public int SweepTargetParallelism { get; set; } = 4;
///
/// WP2.6c (arch-review misc — unbounded S&F observer queue): capacity of the
/// cached-call audit-observer pump's queue. It was the one unbounded
/// Channel<T> left in the system — a slow/stuck
/// ICachedCallLifecycleObserver (a SQLite audit write) could not stretch
/// the retry sweep, but nothing stopped it growing without bound while the sweep kept
/// posting. Bounded with
/// — the same overflow policy as its sibling bounded channels
/// (SiteEventLogger's write queue, the debug/alarm stream hubs) — so a stuck
/// observer sheds the oldest unprocessed notifications instead of leaking memory; drops
/// are counted (see StoreAndForwardService.ObserverQueueDroppedCount).
///
public int ObserverQueueCapacity { get; set; } = 10_000;
}