package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.FormulaireDTO;
import dev.lions.unionflow.client.dto.SouscriptionDTO;
import dev.lions.unionflow.client.service.FormulaireService;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

@Named("formulaireBean")
@RequestScoped
public class FormulaireBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(FormulaireBean.class.getName());
    
    // Constantes de navigation outcomes (WOU/DRY - réutilisables)
    private static final String OUTCOME_SOUSCRIPTION_CHECKOUT = "souscriptionCheckoutPage";
    private static final String OUTCOME_FORMULAIRE_DETAILS = "formulaireDetailsPage";
    
    @Inject
    @RestClient
    private FormulaireService formulaireService;
    
    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";
    
    @PostConstruct
    public void init() {
        initializeFormulaires();
    }
    
    private void initializeFormulaires() {
        formulaires = new ArrayList<>();
        try {
            formulaires = formulaireService.listerActifs();
            formulairesPopulaires = formulaireService.listerPopulaires();
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement des formulaires: " + e.getMessage());
            formulaires = new ArrayList<>();
            formulairesPopulaires = new ArrayList<>();
        }
    }
    
    public void selectionnerFormulaire(FormulaireDTO formulaire) {
        this.formulaireSelectionne = formulaire;
    }
    
    public String procederSouscription() {
        if (formulaireSelectionne != null) {
            // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY)
            return OUTCOME_SOUSCRIPTION_CHECKOUT + "?formulaire=" + 
                   formulaireSelectionne.getId() + 
                   "&facturation=" + typeFacturationSelectionne.name() + 
                   "&faces-redirect=true";
        }
        return null;
    }
    
    public String voirDetailsFormulaire(FormulaireDTO formulaire) {
        // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY)
        return OUTCOME_FORMULAIRE_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; }
}