package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.MembreDTO;
import dev.lions.unionflow.client.service.MembreService;
import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Named;
import jakarta.inject.Inject;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Named("membreListeBean")
@SessionScoped
public class MembreListeBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Inject
    @RestClient
    MembreService membreService;
    
    // Statistiques générales
    private int totalMembres;
    private int membresActifs;
    private int cotisationsAJour;
    private int nouveauxMembres;
    private int membresInactifs;
    
    // Filtres
    private String searchFilter = "";
    private String statutFilter = "";
    private String typeFilter = "";
    private String cotisationFilter = "";
    private String entiteFilter = "";
    
    // Filtres avancés
    private Integer ageMin;
    private Integer ageMax;
    private String genreFilter = "";
    private String villeFilter = "";
    private LocalDate dateAdhesionDebut;
    private LocalDate dateAdhesionFin;
    private String professionFilter = "";
    private Boolean aDesEnfants;
    
    // Messages groupés
    private String sujetMessage;
    private String contenuMessage;
    private List<String> canauxMessage = new ArrayList<>();
    
    // Import/Export
    private boolean mettreAJourExistants = false;
    private String formatExport = "EXCEL";
    private List<String> colonnesExport = new ArrayList<>();
    private boolean exporterSelection = false;
    
    // Données
    private List<MembreDTO> membres = new ArrayList<>();
    private List<MembreDTO> selectedMembres = new ArrayList<>();
    private List<MembreDTO> membresFiltres = new ArrayList<>();
    
    @PostConstruct
    public void init() {
        try {
            chargerMembres();
            chargerStatistiques();
        } catch (Exception e) {
            System.err.println("Erreur lors de l'initialisation: " + e.getMessage());
            e.printStackTrace();
            // Données de fallback
            this.totalMembres = 0;
            this.membresActifs = 0;
            this.cotisationsAJour = 0;
            this.nouveauxMembres = 0;
            this.membresInactifs = 0;
        }
    }
    
    private void chargerMembres() {
        try {
            // Récupération de tous les membres via le service REST
            membres = membreService.listerTous();
            membresFiltres = new ArrayList<>(membres);
            
            System.out.println("Chargement de " + membres.size() + " membres depuis le serveur");
            
        } catch (Exception e) {
            System.err.println("Impossible de charger les membres depuis le serveur: " + e.getMessage());
            // Fallback avec données simulées
            membres = genererDonneesSimulees();
            membresFiltres = new ArrayList<>(membres);
        }
    }
    
    private List<MembreDTO> genererDonneesSimulees() {
        List<MembreDTO> membresSimules = new ArrayList<>();
        for (int i = 1; i <= 20; i++) {
            MembreDTO membre = new MembreDTO();
            membre.setId((long) i);
            membre.setNumeroMembre("M2024" + String.format("%03d", i));
            membre.setNom("Membre" + i);
            membre.setPrenom("Prénom" + i);
            membre.setEmail("membre" + i + "@example.com");
            membre.setTelephone("77 123 45 " + String.format("%02d", i));
            membre.setStatut(i % 10 == 0 ? "INACTIF" : "ACTIF");
            membre.setDateNaissance(LocalDate.now().minusYears(25 + i));
            membre.setProfession("Profession " + (i % 10 + 1));
            membre.setAdresse("Adresse " + i);
            membresSimules.add(membre);
        }
        return membresSimules;
    }
    
    private void chargerStatistiques() {
        try {
            // Récupération des statistiques via le service REST
            MembreService.StatistiquesMembreDTO stats = membreService.obtenirStatistiques();
            
            this.totalMembres = stats.getTotalMembres() != null ? stats.getTotalMembres().intValue() : 0;
            this.membresActifs = stats.getMembresActifs() != null ? stats.getMembresActifs().intValue() : 0;
            this.membresInactifs = stats.getMembresInactifs() != null ? stats.getMembresInactifs().intValue() : 0;
            this.nouveauxMembres = stats.getNouveauxMembres30Jours() != null ? stats.getNouveauxMembres30Jours().intValue() : 0;
            
            // Calcul approximatif des cotisations à jour (à implémenter côté serveur)
            this.cotisationsAJour = (int) (this.membresActifs * 0.85);
            
        } catch (Exception e) {
            System.err.println("Impossible de charger les statistiques: " + e.getMessage());
            // Utiliser les valeurs de fallback définies dans init()
        }
    }
    
    // Actions de recherche et filtrage
    public void rechercher() {
        try {
            List<MembreDTO> resultats = membreService.rechercher(
                searchFilter.isEmpty() ? null : searchFilter,  // nom
                null,  // prenom
                null,  // email
                null,  // telephone
                statutFilter.isEmpty() ? null : statutFilter,
                null,  // associationId
                0,     // page
                100    // size
            );
            
            membresFiltres = resultats;
            System.out.println("Recherche effectuée: " + membresFiltres.size() + " résultats");
            
        } catch (Exception e) {
            System.err.println("Erreur lors de la recherche: " + e.getMessage());
            // En cas d'erreur, appliquer le filtre localement
            appliquerFiltreLocal();
        }
    }
    
    private void appliquerFiltreLocal() {
        membresFiltres = membres.stream()
            .filter(m -> searchFilter.isEmpty() || 
                    m.getNom().toLowerCase().contains(searchFilter.toLowerCase()) ||
                    m.getPrenom().toLowerCase().contains(searchFilter.toLowerCase()) ||
                    m.getEmail().toLowerCase().contains(searchFilter.toLowerCase()))
            .filter(m -> statutFilter.isEmpty() || m.getStatut().equals(statutFilter))
            .collect(Collectors.toList());
    }
    
    public void reinitialiserFiltres() {
        searchFilter = "";
        statutFilter = "";
        typeFilter = "";
        cotisationFilter = "";
        entiteFilter = "";
        ageMin = null;
        ageMax = null;
        genreFilter = "";
        villeFilter = "";
        dateAdhesionDebut = null;
        dateAdhesionFin = null;
        professionFilter = "";
        aDesEnfants = null;
        
        membresFiltres = new ArrayList<>(membres);
    }
    
    public void appliquerFiltresAvances() {
        // Appliquer les filtres avancés
        System.out.println("Application des filtres avancés");
    }
    
    // Import/Export
    public void importerMembres() {
        // Logique d'import des membres
        System.out.println("Import des membres");
    }
    
    public void telechargerModele() {
        // Télécharger modèle d'import
        System.out.println("Téléchargement du modèle");
    }
    
    // Actions avec DTOs
    public String voirProfil(MembreDTO membre) {
        return "/pages/secure/membre/profil?id=" + membre.getId() + "&faces-redirect=true";
    }
    
    public void activerMembre(MembreDTO membre) {
        try {
            membreService.activer(membre.getId());
            membre.setStatut("ACTIF");
            System.out.println("Membre activé: " + membre.getNomComplet());
        } catch (Exception e) {
            System.err.println("Erreur lors de l'activation: " + e.getMessage());
        }
    }
    
    public void desactiverMembre(MembreDTO membre) {
        try {
            membreService.desactiver(membre.getId());
            membre.setStatut("INACTIF");
            System.out.println("Membre désactivé: " + membre.getNomComplet());
        } catch (Exception e) {
            System.err.println("Erreur lors de la désactivation: " + e.getMessage());
        }
    }
    
    public void exporterMembres() {
        try {
            byte[] excelData = membreService.exporterExcel(formatExport, null, statutFilter.isEmpty() ? null : statutFilter);
            // TODO: Gérer le téléchargement du fichier Excel
            System.out.println("Export Excel généré: " + excelData.length + " bytes");
        } catch (Exception e) {
            System.err.println("Erreur lors de l'export: " + e.getMessage());
        }
    }
    
    // Getters et Setters
    public int getTotalMembres() { return totalMembres; }
    public void setTotalMembres(int totalMembres) { this.totalMembres = totalMembres; }
    
    public int getMembresActifs() { return membresActifs; }
    public void setMembresActifs(int membresActifs) { this.membresActifs = membresActifs; }
    
    public int getCotisationsAJour() { return cotisationsAJour; }
    public void setCotisationsAJour(int cotisationsAJour) { this.cotisationsAJour = cotisationsAJour; }
    
    public int getNouveauxMembres() { return nouveauxMembres; }
    public void setNouveauxMembres(int nouveauxMembres) { this.nouveauxMembres = nouveauxMembres; }
    
    public int getMembresInactifs() { return membresInactifs; }
    public void setMembresInactifs(int membresInactifs) { this.membresInactifs = membresInactifs; }
    
    public String getSearchFilter() { return searchFilter; }
    public void setSearchFilter(String searchFilter) { this.searchFilter = searchFilter; }
    
    public String getStatutFilter() { return statutFilter; }
    public void setStatutFilter(String statutFilter) { this.statutFilter = statutFilter; }
    
    public String getTypeFilter() { return typeFilter; }
    public void setTypeFilter(String typeFilter) { this.typeFilter = typeFilter; }
    
    public String getCotisationFilter() { return cotisationFilter; }
    public void setCotisationFilter(String cotisationFilter) { this.cotisationFilter = cotisationFilter; }
    
    public String getEntiteFilter() { return entiteFilter; }
    public void setEntiteFilter(String entiteFilter) { this.entiteFilter = entiteFilter; }
    
    public Integer getAgeMin() { return ageMin; }
    public void setAgeMin(Integer ageMin) { this.ageMin = ageMin; }
    
    public Integer getAgeMax() { return ageMax; }
    public void setAgeMax(Integer ageMax) { this.ageMax = ageMax; }
    
    public String getGenreFilter() { return genreFilter; }
    public void setGenreFilter(String genreFilter) { this.genreFilter = genreFilter; }
    
    public String getVilleFilter() { return villeFilter; }
    public void setVilleFilter(String villeFilter) { this.villeFilter = villeFilter; }
    
    public LocalDate getDateAdhesionDebut() { return dateAdhesionDebut; }
    public void setDateAdhesionDebut(LocalDate dateAdhesionDebut) { this.dateAdhesionDebut = dateAdhesionDebut; }
    
    public LocalDate getDateAdhesionFin() { return dateAdhesionFin; }
    public void setDateAdhesionFin(LocalDate dateAdhesionFin) { this.dateAdhesionFin = dateAdhesionFin; }
    
    public String getProfessionFilter() { return professionFilter; }
    public void setProfessionFilter(String professionFilter) { this.professionFilter = professionFilter; }
    
    public Boolean getADesEnfants() { return aDesEnfants; }
    public void setADesEnfants(Boolean aDesEnfants) { this.aDesEnfants = aDesEnfants; }
    
    public String getSujetMessage() { return sujetMessage; }
    public void setSujetMessage(String sujetMessage) { this.sujetMessage = sujetMessage; }
    
    public String getContenuMessage() { return contenuMessage; }
    public void setContenuMessage(String contenuMessage) { this.contenuMessage = contenuMessage; }
    
    public List<String> getCanauxMessage() { return canauxMessage; }
    public void setCanauxMessage(List<String> canauxMessage) { this.canauxMessage = canauxMessage; }
    
    public boolean isMettreAJourExistants() { return mettreAJourExistants; }
    public void setMettreAJourExistants(boolean mettreAJourExistants) { this.mettreAJourExistants = mettreAJourExistants; }
    
    public String getFormatExport() { return formatExport; }
    public void setFormatExport(String formatExport) { this.formatExport = formatExport; }
    
    public List<String> getColonnesExport() { return colonnesExport; }
    public void setColonnesExport(List<String> colonnesExport) { this.colonnesExport = colonnesExport; }
    
    public boolean isExporterSelection() { return exporterSelection; }
    public void setExporterSelection(boolean exporterSelection) { this.exporterSelection = exporterSelection; }
    
    public List<MembreDTO> getMembres() { return membresFiltres; }
    public void setMembres(List<MembreDTO> membres) { this.membres = membres; }
    
    public List<MembreDTO> getSelectedMembres() { return selectedMembres; }
    public void setSelectedMembres(List<MembreDTO> selectedMembres) { this.selectedMembres = selectedMembres; }
    
    public List<MembreDTO> getMembresFiltres() { return membresFiltres; }
    public void setMembresFiltres(List<MembreDTO> membresFiltres) { this.membresFiltres = membresFiltres; }
}