using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SharedLibraryCore.Alerts;
using SharedLibraryCore.Database.Models;

namespace SharedLibraryCore.Interfaces;

public interface IAlertManager
{
    /// <summary>
    /// Initializes the manager
    /// </summary>
    /// <returns></returns>
    Task Initialize();
    
    /// <summary>
    /// Get all the alerts for given client
    /// </summary>
    /// <param name="client">client to retrieve alerts for</param>
    /// <returns></returns>
    IEnumerable<Alert.AlertState> RetrieveAlerts(EFClient client);
    
    /// <summary>
    /// Trigger a new alert
    /// </summary>
    /// <param name="alert">Alert to trigger</param>
    void AddAlert(Alert.AlertState alert);
    
    /// <summary>
    /// Marks an alert as read and removes it from the manager
    /// </summary>
    /// <param name="alertId">Id of the alert to mark as read</param>
    void MarkAlertAsRead(Guid alertId);
    
    /// <summary>
    /// Mark all alerts intended for the given recipientId as read
    /// </summary>
    /// <param name="recipientId">Identifier of the recipient</param>
    void MarkAllAlertsAsRead(int recipientId);
    
    /// <summary>
    /// Registers a static (persistent) event source eg datastore that
    /// gets initialized at startup
    /// </summary>
    /// <param name="alertSource">Source action</param>
    void RegisterStaticAlertSource(Func<Task<IEnumerable<Alert.AlertState>>> alertSource);
    
    /// <summary>
    /// Fires when an alert has been consumed (dimissed)
    /// </summary>
    EventHandler<Alert.AlertState> OnAlertConsumed { get; set; }
    
}