package dev.lions.models;

/**
 * Représente les différents statuts possibles pour une notification système.
 * Chaque statut est associé à une étiquette lisible et une classe CSS
 * pour la mise en forme de l'interface utilisateur.
 */
public enum NotificationStatus {
  UNREAD("Non lu", "notification-unread"),
  READ("Lu", "notification-read"),
  ARCHIVED("Archivé", "notification-archived"),
  DELETED("Supprimé", "notification-deleted"),
  PENDING("En attente", "notification-pending"),
  PROCESSING("En cours de traitement", "notification-processing"),
  ERROR("Erreur", "notification-error");

  private final String label;
  private final String cssClass;

  /**
   * Constructeur privé pour créer une instance de NotificationStatus.
   *
   * @param label Étiquette lisible du statut
   * @param cssClass Classe CSS pour la mise en forme
   */
  private NotificationStatus(String label, String cssClass) {
    this.label = label;
    this.cssClass = cssClass;
  }

  /**
   * Récupère l'étiquette lisible du statut.
   *
   * @return Étiquette du statut
   */
  public String getLabel() {
    return label;
  }

  /**
   * Récupère la classe CSS associée au statut.
   * Cette classe peut être utilisée pour la mise en forme de l'interface utilisateur.
   *
   * @return Classe CSS du statut
   */
  public String getCssClass() {
    return cssClass;
  }

  /**
   * Vérifie si le statut correspond à une notification active.
   * Les notifications archivées ou supprimées ne sont pas considérées comme actives.
   *
   * @return true si la notification est active
   */
  public boolean isActive() {
    return this != ARCHIVED && this != DELETED;
  }

  /**
   * Vérifie si le statut indique que la notification nécessite une attention particulière.
   * Les notifications non lues ou en erreur sont considérées comme nécessitant une attention.
   *
   * @return true si la notification nécessite une attention
   */
  public boolean requiresAttention() {
    return this == UNREAD || this == ERROR;
  }

  /**
   * Vérifie si la transition vers un nouveau statut est autorisée.
   * Les règles de transition sont définies en fonction de l'état actuel.
   *
   * @param newStatus Nouveau statut à atteindre
   * @return true si la transition est autorisée
   */
  public boolean canTransitionTo(NotificationStatus newStatus) {
    if (this == DELETED) {
      return false;
    }

    if (this == ARCHIVED && newStatus != DELETED) {
      return false;
    }

    return true;
  }
}