/**
 * Repository Interface: INotificationRepository
 * 
 * Defines the contract for persisting and retrieving Notification entities.
 */

import type { Notification } from '../entities/Notification';
import type { NotificationType } from '../types/NotificationTypes';

export interface INotificationRepository {
  /**
   * Find a notification by ID
   */
  findById(id: string): Promise<Notification | null>;

  /**
   * Find all notifications for a recipient
   */
  findByRecipientId(recipientId: string): Promise<Notification[]>;

  /**
   * Find unread notifications for a recipient
   */
  findUnreadByRecipientId(recipientId: string): Promise<Notification[]>;

  /**
   * Find notifications by type for a recipient
   */
  findByRecipientIdAndType(recipientId: string, type: NotificationType): Promise<Notification[]>;

  /**
   * Count unread notifications for a recipient
   */
  countUnreadByRecipientId(recipientId: string): Promise<number>;

  /**
   * Save a new notification
   */
  create(notification: Notification): Promise<void>;

  /**
   * Update an existing notification
   */
  update(notification: Notification): Promise<void>;

  /**
   * Delete a notification
   */
  delete(id: string): Promise<void>;

  /**
   * Delete all notifications for a recipient
   */
  deleteAllByRecipientId(recipientId: string): Promise<void>;

  /**
   * Mark all notifications as read for a recipient
   */
  markAllAsReadByRecipientId(recipientId: string): Promise<void>;
}