using System;
using Svrnty.CQRS.Events.Abstractions.Subscriptions;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Svrnty.CQRS.Events.Abstractions.Models;
namespace Svrnty.CQRS.Events.Abstractions.Subscriptions;
///
/// Storage abstraction for persisting and retrieving event subscriptions.
/// Implementations can use any storage mechanism (SQL, NoSQL, in-memory, etc.).
///
public interface ISubscriptionStore
{
///
/// Create a new subscription.
///
/// The subscription to create.
/// Cancellation token.
Task CreateAsync(EventSubscription subscription, CancellationToken cancellationToken = default);
///
/// Get a subscription by its ID.
///
/// The subscription ID.
/// Cancellation token.
/// The subscription, or null if not found.
Task GetByIdAsync(string subscriptionId, CancellationToken cancellationToken = default);
///
/// Get all active subscriptions for a specific subscriber.
///
/// The subscriber ID.
/// Cancellation token.
/// List of subscriptions.
Task> GetBySubscriberIdAsync(string subscriberId, CancellationToken cancellationToken = default);
///
/// Find all active subscriptions for a specific correlation ID.
/// Used to determine which subscribers should receive an event.
///
/// The correlation ID.
/// Cancellation token.
/// List of active subscriptions.
Task> FindByCorrelationIdAsync(string correlationId, CancellationToken cancellationToken = default);
///
/// Update an existing subscription (e.g., to update LastDeliveredSequence or Status).
///
/// The subscription to update.
/// Cancellation token.
Task UpdateAsync(EventSubscription subscription, CancellationToken cancellationToken = default);
///
/// Delete a subscription.
///
/// The subscription ID to delete.
/// Cancellation token.
Task DeleteAsync(string subscriptionId, CancellationToken cancellationToken = default);
///
/// Delete expired or completed subscriptions older than the specified date.
///
/// Delete subscriptions completed/expired before this date.
/// Cancellation token.
/// Number of subscriptions deleted.
Task DeleteOldSubscriptionsAsync(DateTimeOffset olderThan, CancellationToken cancellationToken = default);
}