namespace Distribution.Features.Notifications;
public interface INotificationRepository
{
// ── Inbox ────────────────────────────────────────────────────────────
Task AddAsync(Models.Notification notification);
/// Stops tracking a notification (and its recipients) whose save failed.
void Discard(Models.Notification notification);
Task GetInboxCountAsync(Guid userId, bool unreadOnly);
Task> GetInboxAsync(Guid userId, bool unreadOnly, int page, int pageSize);
Task GetUnreadCountAsync(Guid userId);
Task GetRecipientAsync(Guid userId, Guid recipientId);
Task> GetUnreadRecipientsAsync(Guid userId);
void RemoveRecipient(Models.NotificationRecipient recipient);
// ── Recipient resolution ─────────────────────────────────────────────
Task> FilterActiveUserIdsAsync(IEnumerable userIds);
Task> GetUserIdsByPermissionAsync(string permissionCode);
Task> GetUserIdsByScopeAsync(ScopeKind kind, Guid id);
Task GetReportsToUserIdAsync(Guid userId);
Task GetRouteOwnerUserIdAsync(ScopeKind kind, Guid id);
// ── Retention ────────────────────────────────────────────────────────
Task> GetExpiredReadRecipientsAsync(DateTime cutoff, int take);
Task> GetOrphanNotificationsAsync(int take);
void RemoveRecipients(IEnumerable recipients);
void RemoveNotifications(IEnumerable notifications);
}