package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.service.PreferencesService;
import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.logging.Logger;
import dev.lions.unionflow.client.service.ErrorHandlerService;
import dev.lions.unionflow.client.service.RetryService;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Bean pour la gestion des préférences utilisateur
 * Gère l'apparence, les notifications, la confidentialité et le tableau de bord
 */
@Named("preferencesBean")
@SessionScoped
public class PreferencesBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(PreferencesBean.class);
    
    @Inject
    private UserSession userSession;
    
    @Inject
    @RestClient
    private PreferencesService preferencesService;
    
    @Inject
    ErrorHandlerService errorHandler;
    
    @Inject
    RetryService retryService;
    
    // Apparence
    private String theme = "light";
    private String couleurAccent = "blue";
    private String langue = "fr";
    private String fuseauHoraire = "GMT";
    private String formatDate = "dd/mm/yyyy";
    
    // Notifications
    private boolean notifEvenements = true;
    private boolean notifMessages = true;
    private boolean notifCotisations = true;
    private boolean notifSysteme = false;
    private boolean emailQuotidien = false;
    private boolean emailHebdo = true;
    private boolean emailUrgent = true;
    private boolean emailPromo = false;
    private boolean smsUrgent = false;
    private boolean smsRappels = false;
    private boolean smsEvenements = false;
    private String heuresSMS = "08-20";
    
    // Confidentialité
    private String visibiliteProfil = "publique";
    private boolean doubleAuth = true;
    private boolean connexionSecure = true;
    private boolean deconnexionAuto = false;
    private String dureeSession = "480";
    
    // Tableau de bord
    private boolean widgetActivites = true;
    private boolean widgetEvenements = true;
    private boolean widgetCotisations = false;
    private boolean widgetNotifications = true;
    private boolean widgetStatistiques = false;
    private boolean widgetMeteo = false;
    private String layoutDashboard = "grid-3";
    private String pageAccueil = "dashboard";
    private String elementsPage = "25";
    private boolean animations = true;
    
    @PostConstruct
    public void init() {
        chargerPreferences();
    }
    
    /**
     * Charge les préférences depuis le backend
     */
    private void chargerPreferences() {
        try {
            UUID userId = userSession.getCurrentUser().getId();
            if (userId != null) {
                Map<String, Boolean> prefs = preferencesService.obtenirPreferences(userId);
                
                // Mapper les préférences du backend vers les propriétés du bean
                notifEvenements = prefs.getOrDefault("NOUVEL_EVENEMENT", true);
                notifCotisations = prefs.getOrDefault("NOUVELLE_COTISATION", true);
                notifSysteme = prefs.getOrDefault("NOUVEAU_MEMBRE", false);
                emailUrgent = prefs.getOrDefault("EMAIL", true);
                smsUrgent = prefs.getOrDefault("SMS", false);
            }
        } catch (Exception e) {
            LOG.warnf(e, "Erreur lors du chargement des préférences");
            // Utiliser les valeurs par défaut en cas d'erreur
        }
    }
    
    /**
     * Sauvegarde toutes les préférences
     */
    public void sauvegarderPreferences() {
        try {
            UUID userId = userSession.getCurrentUser().getId();
            if (userId == null) {
                errorHandler.showWarning("Erreur", "Utilisateur non identifié");
                return;
            }
            
            // Créer un Map avec toutes les préférences de notification
            Map<String, Boolean> prefs = new HashMap<>();
            prefs.put("NOUVEL_EVENEMENT", notifEvenements);
            prefs.put("NOUVELLE_COTISATION", notifCotisations);
            prefs.put("NOUVEAU_MEMBRE", notifSysteme);
            prefs.put("EMAIL", emailUrgent);
            prefs.put("SMS", smsUrgent);
            prefs.put("RAPPEL_COTISATION", smsRappels);
            prefs.put("RAPPEL_EVENEMENT", smsEvenements);
            
            // Appeler le service backend
            retryService.executeWithRetrySupplier(
                () -> {
                    preferencesService.mettreAJourPreferences(userId, prefs);
                    return null;
                },
                "mise à jour des préférences"
            );
            
            errorHandler.showSuccess("Succès", "Vos préférences ont été enregistrées avec succès");
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors de la sauvegarde");
            errorHandler.handleException(e, "lors de la sauvegarde des préférences", null);
        }
    }
    
    /**
     * Réinitialise les préférences aux valeurs par défaut
     */
    public void reinitialiserPreferences() {
        try {
            UUID userId = userSession.getCurrentUser().getId();
            if (userId == null) {
                errorHandler.showWarning("Erreur", "Utilisateur non identifié");
                return;
            }
            
            retryService.executeWithRetrySupplier(
                () -> {
                    preferencesService.reinitialiserPreferences(userId);
                    return null;
                },
                "réinitialisation des préférences"
            );
            
            // Recharger les préférences
            chargerPreferences();
            
            // Réinitialiser les autres préférences locales
            theme = "light";
            couleurAccent = "blue";
            langue = "fr";
            fuseauHoraire = "GMT";
            formatDate = "dd/mm/yyyy";
            
            emailQuotidien = false;
            emailHebdo = true;
            emailPromo = false;
            
            visibiliteProfil = "publique";
            doubleAuth = true;
            connexionSecure = true;
            deconnexionAuto = false;
            dureeSession = "480";
            
            widgetActivites = true;
            widgetEvenements = true;
            widgetCotisations = false;
            widgetNotifications = true;
            widgetStatistiques = false;
            widgetMeteo = false;
            layoutDashboard = "grid-3";
            pageAccueil = "dashboard";
            elementsPage = "25";
            animations = true;
            
            errorHandler.showSuccess("Succès", "Les préférences ont été réinitialisées aux valeurs par défaut");
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors de la réinitialisation");
            errorHandler.handleException(e, "lors de la réinitialisation des préférences", null);
        }
    }
    
    // Getters et Setters
    public String getTheme() { return theme; }
    public void setTheme(String theme) { this.theme = theme; }
    
    public String getCouleurAccent() { return couleurAccent; }
    public void setCouleurAccent(String couleurAccent) { this.couleurAccent = couleurAccent; }
    
    public String getLangue() { return langue; }
    public void setLangue(String langue) { this.langue = langue; }
    
    public String getFuseauHoraire() { return fuseauHoraire; }
    public void setFuseauHoraire(String fuseauHoraire) { this.fuseauHoraire = fuseauHoraire; }
    
    public String getFormatDate() { return formatDate; }
    public void setFormatDate(String formatDate) { this.formatDate = formatDate; }
    
    public boolean isNotifEvenements() { return notifEvenements; }
    public void setNotifEvenements(boolean notifEvenements) { this.notifEvenements = notifEvenements; }
    
    public boolean isNotifMessages() { return notifMessages; }
    public void setNotifMessages(boolean notifMessages) { this.notifMessages = notifMessages; }
    
    public boolean isNotifCotisations() { return notifCotisations; }
    public void setNotifCotisations(boolean notifCotisations) { this.notifCotisations = notifCotisations; }
    
    public boolean isNotifSysteme() { return notifSysteme; }
    public void setNotifSysteme(boolean notifSysteme) { this.notifSysteme = notifSysteme; }
    
    public boolean isEmailQuotidien() { return emailQuotidien; }
    public void setEmailQuotidien(boolean emailQuotidien) { this.emailQuotidien = emailQuotidien; }
    
    public boolean isEmailHebdo() { return emailHebdo; }
    public void setEmailHebdo(boolean emailHebdo) { this.emailHebdo = emailHebdo; }
    
    public boolean isEmailUrgent() { return emailUrgent; }
    public void setEmailUrgent(boolean emailUrgent) { this.emailUrgent = emailUrgent; }
    
    public boolean isEmailPromo() { return emailPromo; }
    public void setEmailPromo(boolean emailPromo) { this.emailPromo = emailPromo; }
    
    public boolean isSmsUrgent() { return smsUrgent; }
    public void setSmsUrgent(boolean smsUrgent) { this.smsUrgent = smsUrgent; }
    
    public boolean isSmsRappels() { return smsRappels; }
    public void setSmsRappels(boolean smsRappels) { this.smsRappels = smsRappels; }
    
    public boolean isSmsEvenements() { return smsEvenements; }
    public void setSmsEvenements(boolean smsEvenements) { this.smsEvenements = smsEvenements; }
    
    public String getHeuresSMS() { return heuresSMS; }
    public void setHeuresSMS(String heuresSMS) { this.heuresSMS = heuresSMS; }
    
    public String getVisibiliteProfil() { return visibiliteProfil; }
    public void setVisibiliteProfil(String visibiliteProfil) { this.visibiliteProfil = visibiliteProfil; }
    
    public boolean isDoubleAuth() { return doubleAuth; }
    public void setDoubleAuth(boolean doubleAuth) { this.doubleAuth = doubleAuth; }
    
    public boolean isConnexionSecure() { return connexionSecure; }
    public void setConnexionSecure(boolean connexionSecure) { this.connexionSecure = connexionSecure; }
    
    public boolean isDeconnexionAuto() { return deconnexionAuto; }
    public void setDeconnexionAuto(boolean deconnexionAuto) { this.deconnexionAuto = deconnexionAuto; }
    
    public String getDureeSession() { return dureeSession; }
    public void setDureeSession(String dureeSession) { this.dureeSession = dureeSession; }
    
    public boolean isWidgetActivites() { return widgetActivites; }
    public void setWidgetActivites(boolean widgetActivites) { this.widgetActivites = widgetActivites; }
    
    public boolean isWidgetEvenements() { return widgetEvenements; }
    public void setWidgetEvenements(boolean widgetEvenements) { this.widgetEvenements = widgetEvenements; }
    
    public boolean isWidgetCotisations() { return widgetCotisations; }
    public void setWidgetCotisations(boolean widgetCotisations) { this.widgetCotisations = widgetCotisations; }
    
    public boolean isWidgetNotifications() { return widgetNotifications; }
    public void setWidgetNotifications(boolean widgetNotifications) { this.widgetNotifications = widgetNotifications; }
    
    public boolean isWidgetStatistiques() { return widgetStatistiques; }
    public void setWidgetStatistiques(boolean widgetStatistiques) { this.widgetStatistiques = widgetStatistiques; }
    
    public boolean isWidgetMeteo() { return widgetMeteo; }
    public void setWidgetMeteo(boolean widgetMeteo) { this.widgetMeteo = widgetMeteo; }
    
    public String getLayoutDashboard() { return layoutDashboard; }
    public void setLayoutDashboard(String layoutDashboard) { this.layoutDashboard = layoutDashboard; }
    
    public String getPageAccueil() { return pageAccueil; }
    public void setPageAccueil(String pageAccueil) { this.pageAccueil = pageAccueil; }
    
    public String getElementsPage() { return elementsPage; }
    public void setElementsPage(String elementsPage) { this.elementsPage = elementsPage; }
    
    public boolean isAnimations() { return animations; }
    public void setAnimations(boolean animations) { this.animations = animations; }
}

