package dev.lions.unionflow.server.service;

import jakarta.enterprise.context.ApplicationScoped;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.jboss.logging.Logger;

/** Service pour gérer les préférences de notification des utilisateurs */
@ApplicationScoped
public class PreferencesNotificationService {

  private static final Logger LOG = Logger.getLogger(PreferencesNotificationService.class);

  // Stockage temporaire en mémoire (à remplacer par une base de données)
  private final Map<UUID, Map<String, Boolean>> preferencesUtilisateurs = new HashMap<>();

  /** Obtient les préférences de notification d'un utilisateur */
  public Map<String, Boolean> obtenirPreferences(UUID utilisateurId) {
    LOG.infof("Récupération des préférences de notification pour l'utilisateur %s", utilisateurId);

    return preferencesUtilisateurs.getOrDefault(utilisateurId, getPreferencesParDefaut());
  }

  /** Met à jour les préférences de notification d'un utilisateur */
  public void mettreAJourPreferences(UUID utilisateurId, Map<String, Boolean> preferences) {
    LOG.infof("Mise à jour des préférences de notification pour l'utilisateur %s", utilisateurId);

    preferencesUtilisateurs.put(utilisateurId, new HashMap<>(preferences));
  }

  /** Vérifie si un utilisateur souhaite recevoir un type de notification */
  public boolean accepteNotification(UUID utilisateurId, String typeNotification) {
    Map<String, Boolean> preferences = obtenirPreferences(utilisateurId);
    return preferences.getOrDefault(typeNotification, true);
  }

  /** Active un type de notification pour un utilisateur */
  public void activerNotification(UUID utilisateurId, String typeNotification) {
    LOG.infof(
        "Activation de la notification %s pour l'utilisateur %s", typeNotification, utilisateurId);

    Map<String, Boolean> preferences = obtenirPreferences(utilisateurId);
    preferences.put(typeNotification, true);
    mettreAJourPreferences(utilisateurId, preferences);
  }

  /** Désactive un type de notification pour un utilisateur */
  public void desactiverNotification(UUID utilisateurId, String typeNotification) {
    LOG.infof(
        "Désactivation de la notification %s pour l'utilisateur %s",
        typeNotification, utilisateurId);

    Map<String, Boolean> preferences = obtenirPreferences(utilisateurId);
    preferences.put(typeNotification, false);
    mettreAJourPreferences(utilisateurId, preferences);
  }

  /** Réinitialise les préférences d'un utilisateur aux valeurs par défaut */
  public void reinitialiserPreferences(UUID utilisateurId) {
    LOG.infof("Réinitialisation des préférences pour l'utilisateur %s", utilisateurId);

    mettreAJourPreferences(utilisateurId, getPreferencesParDefaut());
  }

  /** Obtient les préférences par défaut */
  private Map<String, Boolean> getPreferencesParDefaut() {
    Map<String, Boolean> preferences = new HashMap<>();

    // Notifications générales
    preferences.put("NOUVELLE_COTISATION", true);
    preferences.put("RAPPEL_COTISATION", true);
    preferences.put("COTISATION_RETARD", true);

    // Notifications d'événements
    preferences.put("NOUVEL_EVENEMENT", true);
    preferences.put("RAPPEL_EVENEMENT", true);
    preferences.put("MODIFICATION_EVENEMENT", true);
    preferences.put("ANNULATION_EVENEMENT", true);

    // Notifications de solidarité
    preferences.put("NOUVELLE_DEMANDE_AIDE", true);
    preferences.put("DEMANDE_AIDE_APPROUVEE", true);
    preferences.put("DEMANDE_AIDE_REJETEE", true);
    preferences.put("NOUVELLE_PROPOSITION_AIDE", true);

    // Notifications administratives
    preferences.put("NOUVEAU_MEMBRE", false);
    preferences.put("MODIFICATION_PROFIL", false);
    preferences.put("RAPPORT_MENSUEL", true);

    // Notifications push
    preferences.put("PUSH_MOBILE", true);
    preferences.put("EMAIL", true);
    preferences.put("SMS", false);

    return preferences;
  }

  /** Obtient tous les utilisateurs qui acceptent un type de notification */
  public Map<UUID, Boolean> obtenirUtilisateursAcceptantNotification(String typeNotification) {
    LOG.infof("Recherche des utilisateurs acceptant la notification %s", typeNotification);

    Map<UUID, Boolean> utilisateursAcceptant = new HashMap<>();

    for (Map.Entry<UUID, Map<String, Boolean>> entry : preferencesUtilisateurs.entrySet()) {
      UUID utilisateurId = entry.getKey();
      Map<String, Boolean> preferences = entry.getValue();

      if (preferences.getOrDefault(typeNotification, true)) {
        utilisateursAcceptant.put(utilisateurId, true);
      }
    }

    return utilisateursAcceptant;
  }

  /** Exporte les préférences d'un utilisateur */
  public Map<String, Object> exporterPreferences(UUID utilisateurId) {
    LOG.infof("Export des préférences pour l'utilisateur %s", utilisateurId);

    Map<String, Object> export = new HashMap<>();
    export.put("utilisateurId", utilisateurId);
    export.put("preferences", obtenirPreferences(utilisateurId));
    export.put("dateExport", java.time.LocalDateTime.now());

    return export;
  }

  /** Importe les préférences d'un utilisateur */
  @SuppressWarnings("unchecked")
  public void importerPreferences(UUID utilisateurId, Map<String, Object> donnees) {
    LOG.infof("Import des préférences pour l'utilisateur %s", utilisateurId);

    if (donnees.containsKey("preferences")) {
      Map<String, Boolean> preferences = (Map<String, Boolean>) donnees.get("preferences");
      mettreAJourPreferences(utilisateurId, preferences);
    }
  }
}
