package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.FormulaireDTO;
import dev.lions.unionflow.client.dto.SouscriptionDTO;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Named("formulaireBean")
@RequestScoped
public class FormulaireBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private List<FormulaireDTO> formulaires;
    private List<FormulaireDTO> formulairesPopulaires;
    private FormulaireDTO formulaireSelectionne;
    private SouscriptionDTO.TypeFacturation typeFacturationSelectionne = SouscriptionDTO.TypeFacturation.MENSUEL;
    
    // Filtres
    private Integer membresMax;
    private BigDecimal budgetMax;
    private String categorieFiltre = "ALL";
    
    public FormulaireBean() {
        initializeFormulaires();
    }
    
    private void initializeFormulaires() {
        formulaires = new ArrayList<>();
        
        // Formulaire STARTER - Pour les petites associations
        FormulaireDTO starter = new FormulaireDTO();
        starter.setId(1L);
        starter.setNom("Starter");
        starter.setDescription("Parfait pour les associations débutantes");
        starter.setQuotaMaxMembres(100);
        starter.setPrixMensuel(new BigDecimal("2000")); // 2K FCFA
        starter.setPrixAnnuel(new BigDecimal("20000")); // 20K FCFA (2 mois gratuits)
        starter.setCouleurTheme("bg-blue-500");
        starter.setIconeFormulaire("pi-star");
        starter.setGestionMembres(true);
        starter.setGestionCotisations(true);
        starter.setGestionEvenements(false);
        starter.setGestionAides(false);
        starter.setRapportsAvances(false);
        starter.setNotificationsEmail(true);
        formulaires.add(starter);
        
        // Formulaire STANDARD - Pour les associations moyennes
        FormulaireDTO standard = new FormulaireDTO();
        standard.setId(2L);
        standard.setNom("Standard");
        standard.setDescription("Idéal pour les associations en croissance");
        standard.setQuotaMaxMembres(200);
        standard.setPrixMensuel(new BigDecimal("3000")); // 3K FCFA
        standard.setPrixAnnuel(new BigDecimal("30000")); // 30K FCFA (2 mois gratuits)
        standard.setCouleurTheme("bg-green-500");
        standard.setIconeFormulaire("pi-users");
        standard.setRecommande(true);
        standard.setGestionMembres(true);
        standard.setGestionCotisations(true);
        standard.setGestionEvenements(true);
        standard.setGestionAides(true);
        standard.setRapportsAvances(false);
        standard.setNotificationsEmail(true);
        standard.setNotificationsSMS(false);
        standard.setGestionDocuments(true);
        formulaires.add(standard);
        
        // Formulaire PREMIUM - Pour les grandes associations
        FormulaireDTO premium = new FormulaireDTO();
        premium.setId(3L);
        premium.setNom("Premium");
        premium.setDescription("Solution complète pour les grandes organisations");
        premium.setQuotaMaxMembres(500);
        premium.setPrixMensuel(new BigDecimal("4000")); // 4K FCFA
        premium.setPrixAnnuel(new BigDecimal("40000")); // 40K FCFA (2 mois gratuits)
        premium.setCouleurTheme("bg-purple-500");
        premium.setIconeFormulaire("pi-crown");
        premium.setGestionMembres(true);
        premium.setGestionCotisations(true);
        premium.setGestionEvenements(true);
        premium.setGestionAides(true);
        premium.setRapportsAvances(true);
        premium.setSupportPrioritaire(true);
        premium.setSauvegardeAutomatique(true);
        premium.setPersonnalisationAvancee(true);
        premium.setIntegrationPaiement(true);
        premium.setNotificationsEmail(true);
        premium.setNotificationsSMS(true);
        premium.setGestionDocuments(true);
        formulaires.add(premium);
        
        // Formulaire CRISTAL - Pour les très grandes organisations
        FormulaireDTO cristal = new FormulaireDTO();
        cristal.setId(4L);
        cristal.setNom("Cristal");
        cristal.setDescription("Solution premium pour les fédérations et grandes entités");
        cristal.setQuotaMaxMembres(2000);
        cristal.setPrixMensuel(new BigDecimal("5000")); // 5K FCFA
        cristal.setPrixAnnuel(new BigDecimal("50000")); // 50K FCFA (2 mois gratuits)
        cristal.setCouleurTheme("bg-indigo-500");
        cristal.setIconeFormulaire("pi-diamond");
        cristal.setGestionMembres(true);
        cristal.setGestionCotisations(true);
        cristal.setGestionEvenements(true);
        cristal.setGestionAides(true);
        cristal.setRapportsAvances(true);
        cristal.setSupportPrioritaire(true);
        cristal.setSauvegardeAutomatique(true);
        cristal.setPersonnalisationAvancee(true);
        cristal.setIntegrationPaiement(true);
        cristal.setNotificationsEmail(true);
        cristal.setNotificationsSMS(true);
        cristal.setGestionDocuments(true);
        formulaires.add(cristal);
        
        // Définir les formulaires populaires (Standard et Premium)
        formulairesPopulaires = new ArrayList<>();
        formulairesPopulaires.add(standard);
        formulairesPopulaires.add(premium);
    }
    
    public void selectionnerFormulaire(FormulaireDTO formulaire) {
        this.formulaireSelectionne = formulaire;
    }
    
    public String procederSouscription() {
        if (formulaireSelectionne != null) {
            // Rediriger vers la page de souscription avec les paramètres
            return "/pages/secure/souscription/checkout?formulaire=" + 
                   formulaireSelectionne.getId() + 
                   "&facturation=" + typeFacturationSelectionne.name() + 
                   "&faces-redirect=true";
        }
        return null;
    }
    
    public String voirDetailsFormulaire(FormulaireDTO formulaire) {
        return "/pages/public/formulaires/details?id=" + formulaire.getId() + "&faces-redirect=true";
    }
    
    public List<FormulaireDTO> getFormulairesFiltres() {
        return formulaires.stream()
                .filter(f -> {
                    // Filtre par nombre de membres
                    if (membresMax != null && f.getQuotaMaxMembres() > membresMax) {
                        return false;
                    }
                    
                    // Filtre par budget
                    if (budgetMax != null) {
                        BigDecimal prix = (typeFacturationSelectionne == SouscriptionDTO.TypeFacturation.MENSUEL) 
                            ? f.getPrixMensuel() : f.getPrixAnnuel();
                        if (prix.compareTo(budgetMax) > 0) {
                            return false;
                        }
                    }
                    
                    // Filtre par catégorie
                    if (!"ALL".equals(categorieFiltre)) {
                        switch (categorieFiltre) {
                            case "SMALL":
                                return f.getQuotaMaxMembres() <= 50;
                            case "MEDIUM":
                                return f.getQuotaMaxMembres() > 50 && f.getQuotaMaxMembres() <= 200;
                            case "LARGE":
                                return f.getQuotaMaxMembres() > 200;
                        }
                    }
                    
                    return true;
                })
                .toList();
    }
    
    public void resetFiltres() {
        membresMax = null;
        budgetMax = null;
        categorieFiltre = "ALL";
    }
    
    public String getPrixAffiche(FormulaireDTO formulaire) {
        if (typeFacturationSelectionne == SouscriptionDTO.TypeFacturation.MENSUEL) {
            return formulaire.getPrixMensuelFormat() + "/mois";
        } else {
            return formulaire.getPrixAnnuelFormat() + "/an";
        }
    }
    
    public String getEconomieAffichee(FormulaireDTO formulaire) {
        if (typeFacturationSelectionne == SouscriptionDTO.TypeFacturation.ANNUEL) {
            int pourcentage = formulaire.getPourcentageEconomie();
            if (pourcentage > 0) {
                return "Économisez " + pourcentage + "%";
            }
        }
        return "";
    }
    
    public boolean isFormulaireFonctionnaliteActive(FormulaireDTO formulaire, String fonctionnalite) {
        switch (fonctionnalite.toLowerCase()) {
            case "membres":
                return formulaire.isGestionMembres();
            case "cotisations":
                return formulaire.isGestionCotisations();
            case "evenements":
                return formulaire.isGestionEvenements();
            case "aides":
                return formulaire.isGestionAides();
            case "rapports":
                return formulaire.isRapportsAvances();
            case "support":
                return formulaire.isSupportPrioritaire();
            case "sauvegarde":
                return formulaire.isSauvegardeAutomatique();
            case "personnalisation":
                return formulaire.isPersonnalisationAvancee();
            case "paiement":
                return formulaire.isIntegrationPaiement();
            case "email":
                return formulaire.isNotificationsEmail();
            case "sms":
                return formulaire.isNotificationsSMS();
            case "documents":
                return formulaire.isGestionDocuments();
            default:
                return false;
        }
    }
    
    public String getComparaisonClasse() {
        return formulaires.size() <= 3 ? "col-12 md:col-4" : "col-12 md:col-6 lg:col-3";
    }
    
    // Getters et Setters
    public List<FormulaireDTO> getFormulaires() { return formulaires; }
    public void setFormulaires(List<FormulaireDTO> formulaires) { this.formulaires = formulaires; }
    
    public List<FormulaireDTO> getFormulairesPopulaires() { return formulairesPopulaires; }
    public void setFormulairesPopulaires(List<FormulaireDTO> formulairesPopulaires) { this.formulairesPopulaires = formulairesPopulaires; }
    
    public FormulaireDTO getFormulaireSelectionne() { return formulaireSelectionne; }
    public void setFormulaireSelectionne(FormulaireDTO formulaireSelectionne) { this.formulaireSelectionne = formulaireSelectionne; }
    
    public SouscriptionDTO.TypeFacturation getTypeFacturationSelectionne() { return typeFacturationSelectionne; }
    public void setTypeFacturationSelectionne(SouscriptionDTO.TypeFacturation typeFacturationSelectionne) { this.typeFacturationSelectionne = typeFacturationSelectionne; }
    
    public Integer getMembresMax() { return membresMax; }
    public void setMembresMax(Integer membresMax) { this.membresMax = membresMax; }
    
    public BigDecimal getBudgetMax() { return budgetMax; }
    public void setBudgetMax(BigDecimal budgetMax) { this.budgetMax = budgetMax; }
    
    public String getCategorieFiltre() { return categorieFiltre; }
    public void setCategorieFiltre(String categorieFiltre) { this.categorieFiltre = categorieFiltre; }
}