package dev.lions.unionflow.client.view;

import dev.lions.unionflow.server.api.dto.formuleabonnement.response.FormuleAbonnementResponse;
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<FormuleAbonnementResponse> formulaires;
    private FormuleAbonnementResponse formulaireSelectionne;
    private FormuleAbonnementResponse 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 FormuleAbonnementResponse();
        // Corrigé: FormuleAbonnementResponse utilise setStatut(), setDevise(), pas setActif()/setDeviseCode()
        nouveauFormulaire.setStatut(dev.lions.unionflow.server.api.enums.formuleabonnement.StatutFormule.ACTIVE);
        nouveauFormulaire.setDevise("XOF");
        // Note: setGestionMembres() et setGestionCotisations() n'existent pas dans FormuleAbonnementResponse
        modeCreation = true;
        modeEdition = false;
    }
    
    public void editerFormulaire(FormuleAbonnementResponse 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) {
                // Corrigé: setDateMiseAJour() → setDateModification()
                nouveauFormulaire.setDateModification(LocalDateTime.now());
                nouveauFormulaire.setModifiePar("Admin");
                formulaires.set(index, nouveauFormulaire);
            }
        }
        
        annulerEdition();
    }
    
    public void supprimerFormulaire(FormuleAbonnementResponse formulaire) {
        // Vérifier s'il y a des souscriptions actives
        if (hasActiveSouscriptions(formulaire)) {
            // Désactiver au lieu de supprimer
            // Corrigé: setActif(false) → setStatut(INACTIVE)
            formulaire.setStatut(dev.lions.unionflow.server.api.enums.formuleabonnement.StatutFormule.INACTIVE);
        } else {
            formulaires.remove(formulaire);
        }
    }
    
    public void annulerEdition() {
        modeCreation = false;
        modeEdition = false;
        formulaireSelectionne = null;
        nouveauFormulaire = null;
    }
    
    public void dupliquerFormulaire(FormuleAbonnementResponse formulaire) {
        FormuleAbonnementResponse 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(FormuleAbonnementResponse formulaire) {
        // Corrigé: utiliser setStatut() au lieu de setActif(), et setDateModification() au lieu de setDateMiseAJour()
        if (formulaire.isActive()) {
            formulaire.setStatut(dev.lions.unionflow.server.api.enums.formuleabonnement.StatutFormule.INACTIVE);
        } else {
            formulaire.setStatut(dev.lions.unionflow.server.api.enums.formuleabonnement.StatutFormule.ACTIVE);
        }
        formulaire.setDateModification(java.time.LocalDateTime.now());
        formulaire.setModifiePar("Admin");
    }
    
    // Méthodes utilitaires
    private FormuleAbonnementResponse cloneFormulaire(FormuleAbonnementResponse original) {
        FormuleAbonnementResponse copie = new FormuleAbonnementResponse();
        copie.setId(original.getId());
        copie.setNom(original.getNom());
        copie.setCode(original.getCode());
        copie.setDescription(original.getDescription());
        // Corrigé: getQuotaMaxMembres() → getMaxMembres()
        copie.setMaxMembres(original.getMaxMembres());
        copie.setPrixMensuel(original.getPrixMensuel());
        copie.setPrixAnnuel(original.getPrixAnnuel());
        // Corrigé: getDeviseCode() → getDevise()
        copie.setDevise(original.getDevise());
        // Corrigé: setActif() → setStatut()
        copie.setStatut(original.getStatut());
        // Corrigé: setRecommande() → setRecommandee()
        copie.setRecommandee(original.getRecommandee());
        // Corrigé: setCouleurTheme() → setCouleur()
        copie.setCouleur(original.getCouleur());
        // Corrigé: setIconeFormulaire() → setIcone()
        copie.setIcone(original.getIcone());
        copie.setType(original.getType());

        // Fonctionnalités (utilisation des vrais champs de l'API)
        copie.setSupportTechnique(original.getSupportTechnique());
        copie.setNiveauSupport(original.getNiveauSupport());
        copie.setFonctionnalitesAvancees(original.getFonctionnalitesAvancees());
        copie.setApiAccess(original.getApiAccess());
        copie.setRapportsPersonnalises(original.getRapportsPersonnalises());
        copie.setIntegrationsTierces(original.getIntegrationsTierces());
        copie.setSauvegardeAutomatique(original.getSauvegardeAutomatique());
        copie.setPersonnalisationInterface(original.getPersonnalisationInterface());
        copie.setMultiLangues(original.getMultiLangues());
        copie.setFormationIncluse(original.getFormationIncluse());
        copie.setHeuresFormation(original.getHeuresFormation());
        copie.setPopulaire(original.getPopulaire());
        copie.setPeriodeEssaiJours(original.getPeriodeEssaiJours());
        copie.setEspaceStockageGB(original.getEspaceStockageGB());
        copie.setMaxAdministrateurs(original.getMaxAdministrateurs());

        // Métadonnées
        copie.setDateCreation(original.getDateCreation());
        // Corrigé: setDateMiseAJour() → setDateModification()
        copie.setDateModification(original.getDateModification());
        copie.setCreePar(original.getCreePar());
        copie.setModifiePar(original.getModifiePar());
        copie.setDateDebutValidite(original.getDateDebutValidite());
        copie.setDateFinValidite(original.getDateFinValidite());
        copie.setOrdreAffichage(original.getOrdreAffichage());
        copie.setNotes(original.getNotes());

        return copie;
    }
    
    private boolean hasActiveSouscriptions(FormuleAbonnementResponse formulaire) {
        // Simulation - vérifier s'il y a des souscriptions actives
        return "Standard".equals(formulaire.getNom()) || "Premium".equals(formulaire.getNom());
    }
    
    public boolean canDeleteFormulaire(FormuleAbonnementResponse formulaire) {
        return !hasActiveSouscriptions(formulaire);
    }
    
    public String getStatutFormulaire(FormuleAbonnementResponse formulaire) {
        // Corrigé: isActif() → isActive()
        if (formulaire.isActive()) {
            return hasActiveSouscriptions(formulaire) ? "Actif avec souscriptions" : "Actif";
        }
        return "Inactif";
    }

    public String getCouleurStatut(FormuleAbonnementResponse formulaire) {
        // Corrigé: isActif() → isActive()
        if (formulaire.isActive()) {
            return hasActiveSouscriptions(formulaire) ? "text-green-600" : "text-blue-600";
        }
        return "text-gray-600";
    }
    
    // Validation
    public boolean isFormulaireValide() {
        if (nouveauFormulaire == null) return false;

        // Corrigé: getQuotaMaxMembres() → getMaxMembres()
        return nouveauFormulaire.getNom() != null && !nouveauFormulaire.getNom().trim().isEmpty() &&
               nouveauFormulaire.getMaxMembres() != null && nouveauFormulaire.getMaxMembres() > 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<FormuleAbonnementResponse> getFormulaires() { return formulaires; }
    public void setFormulaires(List<FormuleAbonnementResponse> formulaires) { this.formulaires = formulaires; }
    
    public FormuleAbonnementResponse getFormulaireSelectionne() { return formulaireSelectionne; }
    public void setFormulaireSelectionne(FormuleAbonnementResponse formulaireSelectionne) { this.formulaireSelectionne = formulaireSelectionne; }
    
    public FormuleAbonnementResponse getNouveauFormulaire() { return nouveauFormulaire; }
    public void setNouveauFormulaire(FormuleAbonnementResponse 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);
    }
}
