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

/**
 * Énumération des types d'aide disponibles dans le système de solidarité
 *
 * <p>Cette énumération définit les différents types d'aide que les membres peuvent demander ou
 * proposer dans le cadre du système de solidarité.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 */
public enum TypeAide {

  // === AIDE FINANCIÈRE ===
  AIDE_FINANCIERE_URGENTE(
      "Aide financière urgente",
      "financiere",
      "urgent",
      "Aide financière pour situation d'urgence",
      "emergency_fund",
      "#F44336",
      true,
      true,
      5000.0,
      50000.0,
      7),

  PRET_SANS_INTERET(
      "Prêt sans intérêt",
      "financiere",
      "important",
      "Prêt sans intérêt entre membres",
      "account_balance",
      "#FF9800",
      true,
      true,
      10000.0,
      100000.0,
      30),

  AIDE_COTISATION(
      "Aide pour cotisation",
      "financiere",
      "normal",
      "Aide pour payer les cotisations",
      "payment",
      "#2196F3",
      true,
      false,
      1000.0,
      10000.0,
      14),

  AIDE_FRAIS_MEDICAUX(
      "Aide frais médicaux",
      "financiere",
      "urgent",
      "Aide pour frais médicaux et hospitaliers",
      "medical_services",
      "#E91E63",
      true,
      true,
      5000.0,
      200000.0,
      7),

  AIDE_FRAIS_SCOLARITE(
      "Aide frais de scolarité",
      "financiere",
      "important",
      "Aide pour frais de scolarité des enfants",
      "school",
      "#9C27B0",
      true,
      true,
      10000.0,
      100000.0,
      21),

  // === AIDE MATÉRIELLE ===
  DON_MATERIEL(
      "Don de matériel",
      "materielle",
      "normal",
      "Don d'objets, équipements ou matériel",
      "inventory",
      "#4CAF50",
      false,
      false,
      null,
      null,
      14),

  PRET_MATERIEL(
      "Prêt de matériel",
      "materielle",
      "normal",
      "Prêt temporaire d'objets ou équipements",
      "build",
      "#607D8B",
      false,
      false,
      null,
      null,
      30),

  AIDE_DEMENAGEMENT(
      "Aide déménagement",
      "materielle",
      "normal",
      "Aide pour déménagement (transport, main d'œuvre)",
      "local_shipping",
      "#795548",
      false,
      false,
      null,
      null,
      7),

  AIDE_TRAVAUX(
      "Aide travaux",
      "materielle",
      "normal",
      "Aide pour travaux de rénovation ou construction",
      "construction",
      "#FF5722",
      false,
      false,
      null,
      null,
      21),

  // === AIDE PROFESSIONNELLE ===
  AIDE_RECHERCHE_EMPLOI(
      "Aide recherche d'emploi",
      "professionnelle",
      "important",
      "Aide pour recherche d'emploi et CV",
      "work",
      "#3F51B5",
      false,
      false,
      null,
      null,
      30),

  FORMATION_PROFESSIONNELLE(
      "Formation professionnelle",
      "professionnelle",
      "normal",
      "Formation et développement des compétences",
      "school",
      "#009688",
      false,
      false,
      null,
      null,
      60),

  CONSEIL_JURIDIQUE(
      "Conseil juridique",
      "professionnelle",
      "important",
      "Conseil et assistance juridique",
      "gavel",
      "#8BC34A",
      false,
      false,
      null,
      null,
      14),

  AIDE_CREATION_ENTREPRISE(
      "Aide création d'entreprise",
      "professionnelle",
      "normal",
      "Accompagnement création d'entreprise",
      "business",
      "#CDDC39",
      false,
      false,
      null,
      null,
      90),

  // === AIDE SOCIALE ===
  GARDE_ENFANTS(
      "Garde d'enfants",
      "sociale",
      "normal",
      "Garde d'enfants ponctuelle ou régulière",
      "child_care",
      "#FFC107",
      false,
      false,
      null,
      null,
      7),

  AIDE_PERSONNES_AGEES(
      "Aide personnes âgées",
      "sociale",
      "important",
      "Aide et accompagnement personnes âgées",
      "elderly",
      "#FF9800",
      false,
      false,
      null,
      null,
      30),

  TRANSPORT(
      "Transport",
      "sociale",
      "normal",
      "Aide au transport (covoiturage, accompagnement)",
      "directions_car",
      "#2196F3",
      false,
      false,
      null,
      null,
      7),

  AIDE_ADMINISTRATIVE(
      "Aide administrative",
      "sociale",
      "normal",
      "Aide pour démarches administratives",
      "description",
      "#9E9E9E",
      false,
      false,
      null,
      null,
      14),

  // === AIDE D'URGENCE ===
  HEBERGEMENT_URGENCE(
      "Hébergement d'urgence",
      "urgence",
      "urgent",
      "Hébergement temporaire d'urgence",
      "home",
      "#F44336",
      false,
      true,
      null,
      null,
      7),

  AIDE_ALIMENTAIRE(
      "Aide alimentaire",
      "urgence",
      "urgent",
      "Aide alimentaire d'urgence",
      "restaurant",
      "#FF5722",
      false,
      true,
      null,
      null,
      3),

  AIDE_VESTIMENTAIRE(
      "Aide vestimentaire",
      "urgence",
      "normal",
      "Don de vêtements et accessoires",
      "checkroom",
      "#795548",
      false,
      false,
      null,
      null,
      14),

  // === AIDE SPÉCIALISÉE ===
  SOUTIEN_PSYCHOLOGIQUE(
      "Soutien psychologique",
      "specialisee",
      "important",
      "Soutien et écoute psychologique",
      "psychology",
      "#E91E63",
      false,
      true,
      null,
      null,
      30),

  AIDE_NUMERIQUE(
      "Aide numérique",
      "specialisee",
      "normal",
      "Aide pour utilisation outils numériques",
      "computer",
      "#607D8B",
      false,
      false,
      null,
      null,
      14),

  TRADUCTION(
      "Traduction",
      "specialisee",
      "normal",
      "Services de traduction et interprétariat",
      "translate",
      "#9C27B0",
      false,
      false,
      null,
      null,
      7),

  AUTRE(
      "Autre",
      "autre",
      "normal",
      "Autre type d'aide non catégorisé",
      "help",
      "#9E9E9E",
      false,
      false,
      null,
      null,
      14);

  private final String libelle;
  private final String categorie;
  private final String priorite;
  private final String description;
  private final String icone;
  private final String couleur;
  private final boolean necessiteMontant;
  private final boolean necessiteValidation;
  private final Double montantMin;
  private final Double montantMax;
  private final int delaiReponseJours;

  TypeAide(
      String libelle,
      String categorie,
      String priorite,
      String description,
      String icone,
      String couleur,
      boolean necessiteMontant,
      boolean necessiteValidation,
      Double montantMin,
      Double montantMax,
      int delaiReponseJours) {
    this.libelle = libelle;
    this.categorie = categorie;
    this.priorite = priorite;
    this.description = description;
    this.icone = icone;
    this.couleur = couleur;
    this.necessiteMontant = necessiteMontant;
    this.necessiteValidation = necessiteValidation;
    this.montantMin = montantMin;
    this.montantMax = montantMax;
    this.delaiReponseJours = delaiReponseJours;
  }

  // === GETTERS ===

  public String getLibelle() {
    return libelle;
  }

  public String getCategorie() {
    return categorie;
  }

  public String getPriorite() {
    return priorite;
  }

  public String getDescription() {
    return description;
  }

  public String getIcone() {
    return icone;
  }

  public String getCouleur() {
    return couleur;
  }

  public boolean isNecessiteMontant() {
    return necessiteMontant;
  }

  public boolean isNecessiteValidation() {
    return necessiteValidation;
  }

  public Double getMontantMin() {
    return montantMin;
  }

  public Double getMontantMax() {
    return montantMax;
  }

  public int getDelaiReponseJours() {
    return delaiReponseJours;
  }

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

  /** Vérifie si le type d'aide est urgent */
  public boolean isUrgent() {
    return "urgent".equals(priorite);
  }

  /** Vérifie si le type d'aide est financier */
  public boolean isFinancier() {
    return "financiere".equals(categorie);
  }

  /** Vérifie si le type d'aide est matériel */
  public boolean isMateriel() {
    return "materielle".equals(categorie);
  }

  /** Vérifie si le montant est dans la fourchette autorisée */
  public boolean isMontantValide(Double montant) {
    if (!necessiteMontant || montant == null) return true;
    if (montantMin != null && montant < montantMin) return false;
    if (montantMax != null && montant > montantMax) return false;
    return true;
  }

  /** Retourne le niveau de priorité numérique */
  public int getNiveauPriorite() {
    return switch (priorite) {
      case "urgent" -> 1;
      case "important" -> 2;
      case "normal" -> 3;
      default -> 3;
    };
  }

  /** Retourne la date limite de réponse */
  public java.time.LocalDateTime getDateLimiteReponse() {
    return java.time.LocalDateTime.now().plusDays(delaiReponseJours);
  }

  /** Retourne les types d'aide par catégorie */
  public static java.util.List<TypeAide> getParCategorie(String categorie) {
    return java.util.Arrays.stream(values())
        .filter(type -> type.getCategorie().equals(categorie))
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les types d'aide urgents */
  public static java.util.List<TypeAide> getUrgents() {
    return java.util.Arrays.stream(values())
        .filter(TypeAide::isUrgent)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les types d'aide financiers */
  public static java.util.List<TypeAide> getFinanciers() {
    return java.util.Arrays.stream(values())
        .filter(TypeAide::isFinancier)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les catégories disponibles */
  public static java.util.Set<String> getCategories() {
    return java.util.Arrays.stream(values())
        .map(TypeAide::getCategorie)
        .collect(java.util.stream.Collectors.toSet());
  }

  /** Retourne le libellé de la catégorie */
  public String getLibelleCategorie() {
    return switch (categorie) {
      case "financiere" -> "Aide financière";
      case "materielle" -> "Aide matérielle";
      case "professionnelle" -> "Aide professionnelle";
      case "sociale" -> "Aide sociale";
      case "urgence" -> "Aide d'urgence";
      case "specialisee" -> "Aide spécialisée";
      case "autre" -> "Autre";
      default -> categorie;
    };
  }

  /** Retourne l'unité du montant si applicable */
  public String getUniteMontant() {
    return necessiteMontant ? "FCFA" : null;
  }

  /** Retourne le message de validation du montant */
  public String getMessageValidationMontant(Double montant) {
    if (!necessiteMontant) return null;
    if (montant == null) return "Le montant est obligatoire";
    if (montantMin != null && montant < montantMin) {
      return String.format("Le montant minimum est de %.0f FCFA", montantMin);
    }
    if (montantMax != null && montant > montantMax) {
      return String.format("Le montant maximum est de %.0f FCFA", montantMax);
    }
    return null;
  }
}
