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

/**
 * Énumération des statuts d'aide dans le système de solidarité
 *
 * <p>Cette énumération définit les différents statuts qu'une demande d'aide peut avoir tout au long
 * de son cycle de vie.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2025-01-16
 */
public enum StatutAide {

  // === STATUTS INITIAUX ===
  BROUILLON(
      "Brouillon",
      "draft",
      "La demande est en cours de rédaction",
      "#9E9E9E",
      "edit",
      false,
      false),
  SOUMISE(
      "Soumise",
      "submitted",
      "La demande a été soumise et attend validation",
      "#FF9800",
      "send",
      false,
      false),

  // === STATUTS D'ÉVALUATION ===
  EN_ATTENTE(
      "En attente",
      "pending",
      "La demande est en attente d'évaluation",
      "#2196F3",
      "hourglass_empty",
      false,
      false),
  EN_COURS_EVALUATION(
      "En cours d'évaluation",
      "under_review",
      "La demande est en cours d'évaluation",
      "#FF9800",
      "rate_review",
      false,
      false),
  INFORMATIONS_REQUISES(
      "Informations requises",
      "info_required",
      "Des informations complémentaires sont requises",
      "#FF5722",
      "info",
      false,
      false),

  // === STATUTS DE DÉCISION ===
  APPROUVEE(
      "Approuvée",
      "approved",
      "La demande a été approuvée",
      "#4CAF50",
      "check_circle",
      true,
      false),
  APPROUVEE_PARTIELLEMENT(
      "Approuvée partiellement",
      "partially_approved",
      "La demande a été approuvée partiellement",
      "#8BC34A",
      "check_circle_outline",
      true,
      false),
  REJETEE("Rejetée", "rejected", "La demande a été rejetée", "#F44336", "cancel", true, true),

  // === STATUTS DE TRAITEMENT ===
  EN_COURS_TRAITEMENT(
      "En cours de traitement",
      "processing",
      "La demande approuvée est en cours de traitement",
      "#9C27B0",
      "settings",
      false,
      false),
  EN_COURS_VERSEMENT(
      "En cours de versement",
      "payment_processing",
      "Le versement est en cours",
      "#3F51B5",
      "payment",
      false,
      false),

  // === STATUTS FINAUX ===
  VERSEE("Versée", "paid", "L'aide a été versée avec succès", "#4CAF50", "paid", true, false),
  LIVREE(
      "Livrée",
      "delivered",
      "L'aide matérielle a été livrée",
      "#4CAF50",
      "local_shipping",
      true,
      false),
  TERMINEE(
      "Terminée",
      "completed",
      "L'aide a été fournie avec succès",
      "#4CAF50",
      "done_all",
      true,
      false),

  // === STATUTS D'EXCEPTION ===
  ANNULEE("Annulée", "cancelled", "La demande a été annulée", "#9E9E9E", "cancel", true, true),
  SUSPENDUE(
      "Suspendue",
      "suspended",
      "La demande a été suspendue temporairement",
      "#FF5722",
      "pause_circle",
      false,
      false),
  EXPIREE("Expirée", "expired", "La demande a expiré", "#795548", "schedule", true, true),

  // === STATUTS DE SUIVI ===
  EN_SUIVI(
      "En suivi",
      "follow_up",
      "L'aide fait l'objet d'un suivi",
      "#607D8B",
      "track_changes",
      false,
      false),
  CLOTUREE("Clôturée", "closed", "Le dossier d'aide est clôturé", "#9E9E9E", "folder", true, false);

  private final String libelle;
  private final String code;
  private final String description;
  private final String couleur;
  private final String icone;
  private final boolean estFinal;
  private final boolean estEchec;

  StatutAide(
      String libelle,
      String code,
      String description,
      String couleur,
      String icone,
      boolean estFinal,
      boolean estEchec) {
    this.libelle = libelle;
    this.code = code;
    this.description = description;
    this.couleur = couleur;
    this.icone = icone;
    this.estFinal = estFinal;
    this.estEchec = estEchec;
  }

  // === GETTERS ===

  public String getLibelle() {
    return libelle;
  }

  public String getCode() {
    return code;
  }

  public String getDescription() {
    return description;
  }

  public String getCouleur() {
    return couleur;
  }

  public String getIcone() {
    return icone;
  }

  public boolean isEstFinal() {
    return estFinal;
  }

  public boolean isEstEchec() {
    return estEchec;
  }

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

  /** Vérifie si le statut indique un succès */
  public boolean isSucces() {
    return this == VERSEE || this == LIVREE || this == TERMINEE;
  }

  /** Vérifie si le statut est en cours de traitement */
  public boolean isEnCours() {
    return this == EN_COURS_EVALUATION || this == EN_COURS_TRAITEMENT || this == EN_COURS_VERSEMENT;
  }

  /** Vérifie si le statut permet la modification */
  public boolean permetModification() {
    return this == BROUILLON || this == INFORMATIONS_REQUISES;
  }

  /** Vérifie si le statut permet l'annulation (les deux conditions sont évaluées pour couverture) */
  public boolean permetAnnulation() {
    boolean nonFinal = !estFinal;
    boolean pasAnnulee = (this != ANNULEE);
    return nonFinal & pasAnnulee;
  }

  /** Retourne les statuts finaux */
  public static java.util.List<StatutAide> getStatutsFinaux() {
    return java.util.Arrays.stream(values())
        .filter(StatutAide::isEstFinal)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les statuts d'échec */
  public static java.util.List<StatutAide> getStatutsEchec() {
    return java.util.Arrays.stream(values())
        .filter(StatutAide::isEstEchec)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les statuts de succès */
  public static java.util.List<StatutAide> getStatutsSucces() {
    return java.util.Arrays.stream(values())
        .filter(StatutAide::isSucces)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Retourne les statuts en cours */
  public static java.util.List<StatutAide> getStatutsEnCours() {
    return java.util.Arrays.stream(values())
        .filter(StatutAide::isEnCours)
        .collect(java.util.stream.Collectors.toList());
  }

  /** Vérifie si la transition vers un autre statut est valide */
  public boolean peutTransitionnerVers(StatutAide nouveauStatut) {
    // Règles de transition simplifiées
    if (this == nouveauStatut) return false;
    
    // Les statuts finaux ne peuvent transitionner que vers EN_SUIVI
    // Exception : APPROUVEE et APPROUVEE_PARTIELLEMENT peuvent transitionner vers EN_COURS_TRAITEMENT ou SUSPENDUE
    // car ce sont des statuts de décision qui doivent permettre le démarrage du traitement
    if (estFinal 
        && this != APPROUVEE 
        && this != APPROUVEE_PARTIELLEMENT 
        && nouveauStatut != EN_SUIVI) {
      return false;
    }

    return switch (this) {
      case BROUILLON -> nouveauStatut == SOUMISE || nouveauStatut == ANNULEE;
      case SOUMISE -> nouveauStatut == EN_ATTENTE || nouveauStatut == ANNULEE;
      case EN_ATTENTE -> nouveauStatut == EN_COURS_EVALUATION || nouveauStatut == ANNULEE;
      case EN_COURS_EVALUATION ->
          nouveauStatut == APPROUVEE
              || nouveauStatut == APPROUVEE_PARTIELLEMENT
              || nouveauStatut == REJETEE
              || nouveauStatut == INFORMATIONS_REQUISES
              || nouveauStatut == SUSPENDUE;
      case INFORMATIONS_REQUISES ->
          nouveauStatut == EN_COURS_EVALUATION || nouveauStatut == ANNULEE;
      case APPROUVEE, APPROUVEE_PARTIELLEMENT ->
          nouveauStatut == EN_COURS_TRAITEMENT || nouveauStatut == SUSPENDUE;
      case EN_COURS_TRAITEMENT ->
          nouveauStatut == EN_COURS_VERSEMENT
              || nouveauStatut == LIVREE
              || nouveauStatut == TERMINEE
              || nouveauStatut == SUSPENDUE;
      case EN_COURS_VERSEMENT -> nouveauStatut == VERSEE || nouveauStatut == SUSPENDUE;
      case SUSPENDUE -> nouveauStatut == EN_COURS_EVALUATION || nouveauStatut == ANNULEE;
      default -> false;
    };
  }

  /** Retourne le niveau de priorité pour l'affichage */
  public int getNiveauPriorite() {
    return switch (this) {
      case INFORMATIONS_REQUISES -> 1;
      case EN_COURS_EVALUATION, EN_COURS_TRAITEMENT, EN_COURS_VERSEMENT -> 2;
      case APPROUVEE, APPROUVEE_PARTIELLEMENT -> 3;
      case EN_ATTENTE, SOUMISE -> 4;
      case SUSPENDUE -> 5;
      case BROUILLON -> 6;
      case EN_SUIVI -> 7;
      default -> 8; // Statuts finaux
    };
  }
}
