package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.FormulaireDTO;
import dev.lions.unionflow.client.service.FormulaireService;
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 java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;

@Named("adminFormulaireBean")
@SessionScoped
public class AdminFormulaireBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(AdminFormulaireBean.class.getName());
    
    @Inject
    @RestClient
    private FormulaireService formulaireService;
    
    private List<FormulaireDTO> formulaires;
    private FormulaireDTO formulaireSelectionne;
    private FormulaireDTO nouveauFormulaire;
    private boolean modeEdition = false;
    private boolean modeCreation = false;
    
    // Statistiques
    private int totalSouscriptions = 0;
    private BigDecimal revenusFormulaires = BigDecimal.ZERO;
    private String formulairePlusPopulaire = "";
    
    @PostConstruct
    public void init() {
        initializeData();
    }
    
    private void initializeData() {
        formulaires = new ArrayList<>();
        try {
            formulaires = formulaireService.listerTous();
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement des formulaires: " + e.getMessage());
        }
        
        // Initialiser les statistiques
        totalSouscriptions = 127; // Plus d'entités avec prix accessibles
        revenusFormulaires = new BigDecimal("381000"); // 127 * 3000 (moyenne)
        formulairePlusPopulaire = "Standard";
    }
    
    // Actions CRUD
    public void nouveauFormulaire() {
        nouveauFormulaire = new FormulaireDTO();
        nouveauFormulaire.setActif(true);
        nouveauFormulaire.setDeviseCode("XOF");
        nouveauFormulaire.setGestionMembres(true);
        nouveauFormulaire.setGestionCotisations(true);
        modeCreation = true;
        modeEdition = false;
    }
    
    public void editerFormulaire(FormulaireDTO formulaire) {
        this.formulaireSelectionne = formulaire;
        this.nouveauFormulaire = cloneFormulaire(formulaire);
        modeEdition = true;
        modeCreation = false;
    }
    
    public void sauvegarderFormulaire() {
        if (modeCreation) {
            // Générer un nouvel ID UUID
            nouveauFormulaire.setId(UUID.randomUUID());
            nouveauFormulaire.setDateCreation(LocalDateTime.now());
            nouveauFormulaire.setCreePar("Admin");
            
            formulaires.add(nouveauFormulaire);
            
        } else if (modeEdition) {
            // Mettre à jour le formulaire existant
            int index = formulaires.indexOf(formulaireSelectionne);
            if (index >= 0) {
                nouveauFormulaire.setDateMiseAJour(LocalDateTime.now());
                nouveauFormulaire.setModifiePar("Admin");
                formulaires.set(index, nouveauFormulaire);
            }
        }
        
        annulerEdition();
    }
    
    public void supprimerFormulaire(FormulaireDTO formulaire) {
        // Vérifier s'il y a des souscriptions actives
        if (hasActiveSouscriptions(formulaire)) {
            // Désactiver au lieu de supprimer
            formulaire.setActif(false);
        } else {
            formulaires.remove(formulaire);
        }
    }
    
    public void annulerEdition() {
        modeCreation = false;
        modeEdition = false;
        formulaireSelectionne = null;
        nouveauFormulaire = null;
    }
    
    public void dupliquerFormulaire(FormulaireDTO formulaire) {
        FormulaireDTO copie = cloneFormulaire(formulaire);
        copie.setId(UUID.randomUUID());
        copie.setNom(formulaire.getNom() + " (Copie)");
        copie.setDateCreation(LocalDateTime.now());
        copie.setCreePar("Admin");
        
        this.nouveauFormulaire = copie;
        modeCreation = true;
        modeEdition = false;
    }
    
    public void activerDesactiverFormulaire(FormulaireDTO formulaire) {
        formulaire.setActif(!formulaire.isActif());
        formulaire.setDateMiseAJour(LocalDateTime.now());
        formulaire.setModifiePar("Admin");
    }
    
    // Méthodes utilitaires
    private FormulaireDTO cloneFormulaire(FormulaireDTO original) {
        FormulaireDTO copie = new FormulaireDTO();
        copie.setId(original.getId());
        copie.setNom(original.getNom());
        copie.setDescription(original.getDescription());
        copie.setQuotaMaxMembres(original.getQuotaMaxMembres());
        copie.setPrixMensuel(original.getPrixMensuel());
        copie.setPrixAnnuel(original.getPrixAnnuel());
        copie.setDeviseCode(original.getDeviseCode());
        copie.setActif(original.isActif());
        copie.setRecommande(original.isRecommande());
        copie.setCouleurTheme(original.getCouleurTheme());
        copie.setIconeFormulaire(original.getIconeFormulaire());
        
        // Fonctionnalités
        copie.setGestionMembres(original.isGestionMembres());
        copie.setGestionCotisations(original.isGestionCotisations());
        copie.setGestionEvenements(original.isGestionEvenements());
        copie.setGestionAides(original.isGestionAides());
        copie.setRapportsAvances(original.isRapportsAvances());
        copie.setSupportPrioritaire(original.isSupportPrioritaire());
        copie.setSauvegardeAutomatique(original.isSauvegardeAutomatique());
        copie.setPersonnalisationAvancee(original.isPersonnalisationAvancee());
        copie.setIntegrationPaiement(original.isIntegrationPaiement());
        copie.setNotificationsEmail(original.isNotificationsEmail());
        copie.setNotificationsSMS(original.isNotificationsSMS());
        copie.setGestionDocuments(original.isGestionDocuments());
        
        // Métadonnées
        copie.setDateCreation(original.getDateCreation());
        copie.setDateMiseAJour(original.getDateMiseAJour());
        copie.setCreePar(original.getCreePar());
        copie.setModifiePar(original.getModifiePar());
        
        return copie;
    }
    
    private boolean hasActiveSouscriptions(FormulaireDTO formulaire) {
        // Simulation - vérifier s'il y a des souscriptions actives
        return "Standard".equals(formulaire.getNom()) || "Premium".equals(formulaire.getNom());
    }
    
    public boolean canDeleteFormulaire(FormulaireDTO formulaire) {
        return !hasActiveSouscriptions(formulaire);
    }
    
    public String getStatutFormulaire(FormulaireDTO formulaire) {
        if (formulaire.isActif()) {
            return hasActiveSouscriptions(formulaire) ? "Actif avec souscriptions" : "Actif";
        }
        return "Inactif";
    }
    
    public String getCouleurStatut(FormulaireDTO formulaire) {
        if (formulaire.isActif()) {
            return hasActiveSouscriptions(formulaire) ? "text-green-600" : "text-blue-600";
        }
        return "text-gray-600";
    }
    
    // Validation
    public boolean isFormulaireValide() {
        if (nouveauFormulaire == null) return false;
        
        return nouveauFormulaire.getNom() != null && !nouveauFormulaire.getNom().trim().isEmpty() &&
               nouveauFormulaire.getQuotaMaxMembres() != null && nouveauFormulaire.getQuotaMaxMembres() > 0 &&
               nouveauFormulaire.getPrixMensuel() != null && nouveauFormulaire.getPrixMensuel().compareTo(BigDecimal.ZERO) > 0 &&
               nouveauFormulaire.getPrixAnnuel() != null && nouveauFormulaire.getPrixAnnuel().compareTo(BigDecimal.ZERO) > 0;
    }
    
    // Listes pour les sélections
    public List<String> getCouleursTheme() {
        List<String> couleurs = new ArrayList<>();
        couleurs.add("bg-blue-500");
        couleurs.add("bg-green-500");
        couleurs.add("bg-purple-500");
        couleurs.add("bg-indigo-500");
        couleurs.add("bg-red-500");
        couleurs.add("bg-orange-500");
        couleurs.add("bg-yellow-500");
        couleurs.add("bg-teal-500");
        couleurs.add("bg-pink-500");
        return couleurs;
    }
    
    public List<String> getIconesFormulaire() {
        List<String> icones = new ArrayList<>();
        icones.add("pi-star");
        icones.add("pi-users");
        icones.add("pi-crown");
        icones.add("pi-building");
        icones.add("pi-heart");
        icones.add("pi-shield");
        icones.add("pi-trophy");
        icones.add("pi-diamond");
        icones.add("pi-thumbs-up");
        return icones;
    }
    
    // Getters et Setters
    public List<FormulaireDTO> getFormulaires() { return formulaires; }
    public void setFormulaires(List<FormulaireDTO> formulaires) { this.formulaires = formulaires; }
    
    public FormulaireDTO getFormulaireSelectionne() { return formulaireSelectionne; }
    public void setFormulaireSelectionne(FormulaireDTO formulaireSelectionne) { this.formulaireSelectionne = formulaireSelectionne; }
    
    public FormulaireDTO getNouveauFormulaire() { return nouveauFormulaire; }
    public void setNouveauFormulaire(FormulaireDTO nouveauFormulaire) { this.nouveauFormulaire = nouveauFormulaire; }
    
    public boolean isModeEdition() { return modeEdition; }
    public void setModeEdition(boolean modeEdition) { this.modeEdition = modeEdition; }
    
    public boolean isModeCreation() { return modeCreation; }
    public void setModeCreation(boolean modeCreation) { this.modeCreation = modeCreation; }
    
    public int getTotalSouscriptions() { return totalSouscriptions; }
    public void setTotalSouscriptions(int totalSouscriptions) { this.totalSouscriptions = totalSouscriptions; }
    
    public BigDecimal getRevenusFormulaires() { return revenusFormulaires; }
    public void setRevenusFormulaires(BigDecimal revenusFormulaires) { this.revenusFormulaires = revenusFormulaires; }
    
    public String getFormulairePlusPopulaire() { return formulairePlusPopulaire; }
    public void setFormulairePlusPopulaire(String formulairePlusPopulaire) { this.formulairePlusPopulaire = formulairePlusPopulaire; }
    
    public String getRevenusFormulairesFormat() {
        return String.format("%,.0f XOF", revenusFormulaires);
    }
}