package dev.lions.models;

import lombok.Getter;

/**
 * Représente les différents types de notifications utilisées dans l'application.
 * Chaque type de notification est associé à un titre, un message par défaut et
 * un indicateur de criticité.
 */
public enum NotificationType {
  NEW_CONTACT(true, "Nouveau contact", "Un nouveau contact a été reçu"),
  PROJECT_UPDATE(false, "Mise à jour projet", "Un projet a été mis à jour"),
  TASK_ASSIGNED(true, "Tâche assignée", "Une nouvelle tâche vous a été assignée"),
  COMMENT_ADDED(false, "Nouveau commentaire", "Un commentaire a été ajouté"),
  DEADLINE_APPROACHING(true, "Échéance proche", "Une échéance approche"),
  SYSTEM_ALERT(true, "Alerte système", "Une alerte système requiert votre attention"),
  MAINTENANCE_SCHEDULED(false, "Maintenance planifiée", "Une maintenance est planifiée"),
  USER_MENTION(true, "Mention", "Vous avez été mentionné"),
  SECURITY_ALERT(true, "Alerte sécurité", "Un problème de sécurité a été détecté"),
  RESOURCE_LIMIT(true, "Limite ressources", "Une limite de ressources a été atteinte");

  @Getter
  private final String title;
  @Getter
  private final String defaultMessage;
  private final boolean isCritical;

  /**
   * Constructeur privé pour créer une instance de NotificationType.
   *
   * @param isCritical Indicateur de criticité de la notification
   * @param title Titre de la notification
   * @param defaultMessage Message par défaut de la notification
   */
  private NotificationType(boolean isCritical, String title, String defaultMessage) {
    this.isCritical = isCritical;
    this.title = title;
    this.defaultMessage = defaultMessage;
  }

  /**
   * Récupère le modèle de notification sous forme de chaîne de caractères.
   *
   * @return Modèle de notification avec le titre et le message par défaut
   */
  public String getNotificationTemplate() {
    return String.format("%s : %s", this.title, this.defaultMessage);
  }

  /**
   * Indique si le type de notification est critique.
   * Les notifications critiques nécessitent généralement une attention prioritaire.
   *
   * @return true si le type de notification est critique
   */
  public boolean isCritical() {
    return isCritical;
  }
}