using System;
using Svrnty.CQRS.Events.Abstractions.Streaming;
using Svrnty.CQRS.Events.Abstractions.Delivery;
using Svrnty.CQRS.Events.Abstractions.Models;
using Svrnty.CQRS.Events.Abstractions.Configuration;
namespace Svrnty.CQRS.Events.Abstractions.Streaming;
///
/// Configuration for an event stream.
/// Defines storage semantics, delivery guarantees, scope, and retention policies.
///
///
///
/// Stream configuration determines how events are stored, delivered, and retained.
/// Phase 1 focuses on basic configuration; additional properties will be added in later phases.
///
///
public interface IStreamConfiguration
{
///
/// Name of the stream.
///
///
/// Stream names should be descriptive and unique within the application.
/// Common patterns: "{entity}-events", "{workflow-name}", "{domain}-stream"
///
string StreamName { get; }
///
/// Type of stream storage (Ephemeral or Persistent).
///
///
/// Default: for Phase 1.
/// Persistent streams will be fully implemented in Phase 2.
///
StreamType Type { get; set; }
///
/// Delivery guarantee semantics (AtMostOnce, AtLeastOnce, ExactlyOnce).
///
///
/// Default: (recommended for most scenarios).
/// ExactlyOnce will be fully implemented in Phase 3.
///
DeliverySemantics DeliverySemantics { get; set; }
///
/// Visibility scope (Internal or CrossService).
///
///
/// Default: (secure by default).
/// CrossService will be fully implemented in Phase 4 with RabbitMQ support.
///
StreamScope Scope { get; set; }
///
/// Retention policy for persistent streams (how long events are kept).
/// Only applies to persistent streams; ignored for ephemeral streams.
///
///
/// Default: null (no retention policy, keep events forever).
/// Retention policies will be fully implemented in Phase 2.
///
TimeSpan? Retention { get; set; }
///
/// Whether event replay is enabled for this stream.
/// Only applies to persistent streams; ignored for ephemeral streams.
///
///
/// Default: false for Phase 1.
/// Replay functionality will be fully implemented in Phase 2.
///
bool EnableReplay { get; set; }
}