package dev.lions.unionflow.server.api.enums.evenement;

/**
 * Énumération des priorités d'événements dans UnionFlow
 *
 * <p>Cette énumération définit les niveaux de priorité pour les événements, permettant de prioriser
 * l'affichage et les notifications selon l'importance.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-09-21
 */
public enum PrioriteEvenement {
  CRITIQUE(
      "Critique",
      "critical",
      1,
      "Événement critique nécessitant une attention immédiate",
      "#F44336",
      "priority_high",
      true,
      true),

  HAUTE(
      "Haute",
      "high",
      2,
      "Événement de haute priorité",
      "#FF9800",
      "keyboard_arrow_up",
      true,
      false),

  NORMALE(
      "Normale", "normal", 3, "Événement de priorité normale", "#2196F3", "remove", false, false),

  BASSE(
      "Basse",
      "low",
      4,
      "Événement de priorité basse",
      "#4CAF50",
      "keyboard_arrow_down",
      false,
      false);

  private final String libelle;
  private final String code;
  private final int niveau;
  private final String description;
  private final String couleur;
  private final String icone;
  private final boolean notificationImmediate;
  private final boolean escaladeAutomatique;

  PrioriteEvenement(
      String libelle,
      String code,
      int niveau,
      String description,
      String couleur,
      String icone,
      boolean notificationImmediate,
      boolean escaladeAutomatique) {
    this.libelle = libelle;
    this.code = code;
    this.niveau = niveau;
    this.description = description;
    this.couleur = couleur;
    this.icone = icone;
    this.notificationImmediate = notificationImmediate;
    this.escaladeAutomatique = escaladeAutomatique;
  }

  // === GETTERS ===

  public String getLibelle() {
    return libelle;
  }

  public String getCode() {
    return code;
  }

  public int getNiveau() {
    return niveau;
  }

  public String getDescription() {
    return description;
  }

  public String getCouleur() {
    return couleur;
  }

  public String getIcone() {
    return icone;
  }

  public boolean isNotificationImmediate() {
    return notificationImmediate;
  }

  public boolean isEscaladeAutomatique() {
    return escaladeAutomatique;
  }

  // === MÉTHODES UTILITAIRES ===

  /** Vérifie si la priorité est élevée (critique ou haute) */
  public boolean isElevee() {
    return this == CRITIQUE || this == HAUTE;
  }

  /** Vérifie si la priorité nécessite une attention immédiate */
  public boolean isUrgente() {
    return this == CRITIQUE || this == HAUTE;
  }

  /** Compare deux priorités */
  public boolean isSuperieurA(PrioriteEvenement autre) {
    return this.niveau < autre.niveau; // Plus le niveau est bas, plus la priorité est haute
  }

  /** Retourne les priorités élevées */
  public static java.util.List<PrioriteEvenement> getPrioritesElevees() {
    return java.util.Arrays.stream(values())
        .filter(PrioriteEvenement::isElevee)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les priorités urgentes */
  public static java.util.List<PrioriteEvenement> getPrioritesUrgentes() {
    return java.util.Arrays.stream(values())
        .filter(PrioriteEvenement::isUrgente)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Détermine la priorité basée sur le type d'événement */
  public static PrioriteEvenement determinerPriorite(TypeEvenementMetier typeEvenement) {
    return switch (typeEvenement) {
      case ASSEMBLEE_GENERALE -> HAUTE;
      case REUNION_BUREAU -> HAUTE;
      case ACTION_CARITATIVE -> NORMALE;
      case FORMATION -> NORMALE;
      case CONFERENCE -> NORMALE;
      case ACTIVITE_SOCIALE -> BASSE;
      case ATELIER -> BASSE;
      case CEREMONIE -> NORMALE;
      case AUTRE -> NORMALE;
    };
  }

  /** Retourne la priorité par défaut */
  public static PrioriteEvenement getDefaut() {
    return NORMALE;
  }
}
