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

/**
 * Énumération des types de métriques disponibles dans le système analytics UnionFlow
 *
 * <p>Cette énumération définit les différents types de métriques qui peuvent être calculées et
 * affichées dans les tableaux de bord et rapports.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 */
public enum TypeMetrique {

  // === MÉTRIQUES MEMBRES ===
  NOMBRE_MEMBRES_ACTIFS("Nombre de membres actifs", "membres", "count"),
  NOMBRE_MEMBRES_INACTIFS("Nombre de membres inactifs", "membres", "count"),
  TAUX_CROISSANCE_MEMBRES("Taux de croissance des membres", "membres", "percentage"),
  MOYENNE_AGE_MEMBRES("Âge moyen des membres", "membres", "average"),
  REPARTITION_GENRE_MEMBRES("Répartition par genre", "membres", "distribution"),

  // === MÉTRIQUES FINANCIÈRES ===
  TOTAL_COTISATIONS_COLLECTEES("Total des cotisations collectées", "finance", "amount"),
  COTISATIONS_EN_ATTENTE("Cotisations en attente", "finance", "amount"),
  TAUX_RECOUVREMENT_COTISATIONS("Taux de recouvrement", "finance", "percentage"),
  MOYENNE_COTISATION_MEMBRE("Cotisation moyenne par membre", "finance", "average"),
  EVOLUTION_REVENUS_MENSUELLE("Évolution des revenus mensuels", "finance", "trend"),

  // === MÉTRIQUES ÉVÉNEMENTS ===
  NOMBRE_EVENEMENTS_ORGANISES("Nombre d'événements organisés", "evenements", "count"),
  TAUX_PARTICIPATION_EVENEMENTS("Taux de participation aux événements", "evenements", "percentage"),
  MOYENNE_PARTICIPANTS_EVENEMENT("Moyenne de participants par événement", "evenements", "average"),
  EVENEMENTS_ANNULES("Événements annulés", "evenements", "count"),
  SATISFACTION_EVENEMENTS("Satisfaction des événements", "evenements", "rating"),

  // === MÉTRIQUES SOLIDARITÉ ===
  NOMBRE_DEMANDES_AIDE("Nombre de demandes d'aide", "solidarite", "count"),
  MONTANT_AIDES_ACCORDEES("Montant des aides accordées", "solidarite", "amount"),
  TAUX_APPROBATION_AIDES("Taux d'approbation des aides", "solidarite", "percentage"),
  DELAI_TRAITEMENT_DEMANDES("Délai moyen de traitement", "solidarite", "duration"),
  IMPACT_SOCIAL_MESURE("Impact social mesuré", "solidarite", "score"),

  // === MÉTRIQUES ENGAGEMENT ===
  TAUX_CONNEXION_MOBILE("Taux de connexion mobile", "engagement", "percentage"),
  FREQUENCE_UTILISATION_APP("Fréquence d'utilisation de l'app", "engagement", "frequency"),
  ACTIONS_UTILISATEUR_JOUR("Actions utilisateur par jour", "engagement", "count"),
  RETENTION_UTILISATEURS("Rétention des utilisateurs", "engagement", "percentage"),
  NPS_SATISFACTION("Net Promoter Score", "engagement", "score"),

  // === MÉTRIQUES ORGANISATIONNELLES ===
  NOMBRE_ORGANISATIONS_ACTIVES("Organisations actives", "organisation", "count"),
  TAUX_CROISSANCE_ORGANISATIONS("Croissance des organisations", "organisation", "percentage"),
  MOYENNE_MEMBRES_PAR_ORGANISATION("Membres moyens par organisation", "organisation", "average"),
  ORGANISATIONS_PREMIUM("Organisations premium", "organisation", "count"),
  CHURN_RATE_ORGANISATIONS("Taux de désabonnement", "organisation", "percentage"),

  // === MÉTRIQUES TECHNIQUES ===
  TEMPS_REPONSE_API("Temps de réponse API", "technique", "duration"),
  TAUX_DISPONIBILITE_SYSTEME("Taux de disponibilité", "technique", "percentage"),
  NOMBRE_ERREURS_SYSTEME("Nombre d'erreurs système", "technique", "count"),
  UTILISATION_STOCKAGE("Utilisation du stockage", "technique", "size"),
  PERFORMANCE_MOBILE("Performance mobile", "technique", "score");

  private final String libelle;
  private final String categorie;
  private final String typeValeur;

  /**
   * Constructeur de l'énumération TypeMetrique
   *
   * @param libelle Le libellé affiché à l'utilisateur
   * @param categorie La catégorie de la métrique
   * @param typeValeur Le type de valeur (count, percentage, amount, etc.)
   */
  TypeMetrique(String libelle, String categorie, String typeValeur) {
    this.libelle = libelle;
    this.categorie = categorie;
    this.typeValeur = typeValeur;
  }

  /**
   * Retourne le libellé de la métrique
   *
   * @return Le libellé affiché à l'utilisateur
   */
  public String getLibelle() {
    return libelle;
  }

  /**
   * Retourne la catégorie de la métrique
   *
   * @return La catégorie (membres, finance, evenements, etc.)
   */
  public String getCategorie() {
    return categorie;
  }

  /**
   * Retourne le type de valeur de la métrique
   *
   * @return Le type de valeur (count, percentage, amount, etc.)
   */
  public String getTypeValeur() {
    return typeValeur;
  }

  /**
   * Vérifie si la métrique est de type financier
   *
   * @return true si la métrique concerne les finances
   */
  public boolean isFinanciere() {
    return "finance".equals(this.categorie);
  }

  /**
   * Vérifie si la métrique est de type pourcentage
   *
   * @return true si la métrique est un pourcentage
   */
  public boolean isPourcentage() {
    return "percentage".equals(this.typeValeur);
  }

  /**
   * Vérifie si la métrique est de type compteur
   *
   * @return true si la métrique est un compteur
   */
  public boolean isCompteur() {
    return "count".equals(this.typeValeur);
  }

  /**
   * Retourne l'unité de mesure appropriée pour la métrique
   *
   * @return L'unité de mesure (%, XOF, jours, etc.)
   */
  public String getUnite() {
    return switch (this.typeValeur) {
      case "percentage" -> "%";
      case "amount" -> "XOF";
      case "duration" -> "jours";
      case "size" -> "MB";
      case "frequency" -> "/jour";
      case "rating", "score" -> "/10";
      default -> "";
    };
  }

  /**
   * Retourne l'icône appropriée pour la métrique
   *
   * @return L'icône Material Design
   */
  public String getIcone() {
    return switch (this.categorie) {
      case "membres" -> "people";
      case "finance" -> "attach_money";
      case "evenements" -> "event";
      case "solidarite" -> "favorite";
      case "engagement" -> "trending_up";
      case "organisation" -> "business";
      case "technique" -> "settings";
      default -> "analytics";
    };
  }

  /**
   * Retourne la couleur appropriée pour la métrique
   *
   * @return Le code couleur hexadécimal
   */
  public String getCouleur() {
    return switch (this.categorie) {
      case "membres" -> "#2196F3"; // Bleu
      case "finance" -> "#4CAF50"; // Vert
      case "evenements" -> "#FF9800"; // Orange
      case "solidarite" -> "#E91E63"; // Rose
      case "engagement" -> "#9C27B0"; // Violet
      case "organisation" -> "#607D8B"; // Bleu gris
      case "technique" -> "#795548"; // Marron
      default -> "#757575"; // Gris
    };
  }
}
