package dev.lions.unionflow.client.view;

import dev.lions.unionflow.server.api.dto.formuleabonnement.response.FormuleAbonnementResponse;
import dev.lions.unionflow.server.api.dto.abonnement.response.AbonnementResponse;
import dev.lions.unionflow.server.api.enums.abonnement.TypePeriodeAbonnement;
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<FormuleAbonnementResponse> formulaires;
    private List<FormuleAbonnementResponse> formulairesPopulaires;
    private FormuleAbonnementResponse formulaireSelectionne;
    private TypePeriodeAbonnement typeFacturationSelectionne = TypePeriodeAbonnement.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(FormuleAbonnementResponse 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(FormuleAbonnementResponse formulaire) {
        // Utilisation de navigation outcome au lieu de chemin direct (WOU/DRY)
        return OUTCOME_FORMULAIRE_DETAILS + "?id=" + formulaire.getId() + "&faces-redirect=true";
    }
    
    public List<FormuleAbonnementResponse> getFormulairesFiltres() {
        return formulaires.stream()
                .filter(f -> {
                    // Filtre par nombre de membres
                    if (membresMax != null && f.getMaxMembres() != null && f.getMaxMembres() > membresMax) {
                        return false;
                    }

                    // Filtre par budget
                    if (budgetMax != null) {
                        BigDecimal prix = (typeFacturationSelectionne == TypePeriodeAbonnement.MENSUEL)
                            ? f.getPrixMensuel() : f.getPrixAnnuel();
                        if (prix != null && prix.compareTo(budgetMax) > 0) {
                            return false;
                        }
                    }

                    // Filtre par catégorie
                    if (!"ALL".equals(categorieFiltre)) {
                        if (f.getMaxMembres() == null) return false;
                        switch (categorieFiltre) {
                            case "SMALL":
                                return f.getMaxMembres() <= 50;
                            case "MEDIUM":
                                return f.getMaxMembres() > 50 && f.getMaxMembres() <= 200;
                            case "LARGE":
                                return f.getMaxMembres() > 200;
                        }
                    }

                    return true;
                })
                .toList();
    }
    
    public void resetFiltres() {
        membresMax = null;
        budgetMax = null;
        categorieFiltre = "ALL";
    }
    
    public String getPrixAffiche(FormuleAbonnementResponse formulaire) {
        if (typeFacturationSelectionne == TypePeriodeAbonnement.MENSUEL) {
            BigDecimal prix = formulaire.getPrixMensuel();
            return (prix != null ? String.format("%,.0f", prix.doubleValue()) : "0") + " FCFA/mois";
        } else {
            BigDecimal prix = formulaire.getPrixAnnuel();
            return (prix != null ? String.format("%,.0f", prix.doubleValue()) : "0") + " FCFA/an";
        }
    }

    public String getEconomieAffichee(FormuleAbonnementResponse formulaire) {
        if (typeFacturationSelectionne == TypePeriodeAbonnement.ANNUEL) {
            int pourcentage = formulaire.getPourcentageEconomieAnnuelle();
            if (pourcentage > 0) {
                return "Économisez " + pourcentage + "%";
            }
        }
        return "";
    }
    
    public boolean isFormulaireFonctionnaliteActive(FormuleAbonnementResponse formulaire, String fonctionnalite) {
        switch (fonctionnalite.toLowerCase()) {
            case "support":
                return Boolean.TRUE.equals(formulaire.getSupportTechnique());
            case "rapports":
                return Boolean.TRUE.equals(formulaire.getRapportsPersonnalises());
            case "sauvegarde":
                return Boolean.TRUE.equals(formulaire.getSauvegardeAutomatique());
            case "personnalisation":
                return Boolean.TRUE.equals(formulaire.getPersonnalisationInterface());
            case "api":
                return Boolean.TRUE.equals(formulaire.getApiAccess());
            case "avancees":
                return Boolean.TRUE.equals(formulaire.getFonctionnalitesAvancees());
            case "integrations":
                return Boolean.TRUE.equals(formulaire.getIntegrationsTierces());
            case "langues":
                return Boolean.TRUE.equals(formulaire.getMultiLangues());
            case "formation":
                return Boolean.TRUE.equals(formulaire.getFormationIncluse());
            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<FormuleAbonnementResponse> getFormulaires() { return formulaires; }
    public void setFormulaires(List<FormuleAbonnementResponse> formulaires) { this.formulaires = formulaires; }
    
    public List<FormuleAbonnementResponse> getFormulairesPopulaires() { return formulairesPopulaires; }
    public void setFormulairesPopulaires(List<FormuleAbonnementResponse> formulairesPopulaires) { this.formulairesPopulaires = formulairesPopulaires; }
    
    public FormuleAbonnementResponse getFormulaireSelectionne() { return formulaireSelectionne; }
    public void setFormulaireSelectionne(FormuleAbonnementResponse formulaireSelectionne) { this.formulaireSelectionne = formulaireSelectionne; }
    
    public TypePeriodeAbonnement getTypeFacturationSelectionne() { return typeFacturationSelectionne; }
    public void setTypeFacturationSelectionne(TypePeriodeAbonnement typeFacturationSelectionne) { this.typeFacturationSelectionne = typeFacturationSelectionne; }

    /** Setter surchargé pour la compatibilité JSF (accepte String) */
    public void setTypeFacturationSelectionne(String typeName) {
        if (typeName != null && !typeName.isBlank()) {
            this.typeFacturationSelectionne = TypePeriodeAbonnement.valueOf(typeName);
        }
    }

    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; }
}
