package dev.lions.unionflow.client.view;

import dev.lions.unionflow.server.api.dto.finance.response.AdhesionResponse;
import dev.lions.unionflow.client.service.AdhesionService;
import dev.lions.unionflow.client.service.ErrorHandlerService;
import dev.lions.unionflow.client.service.RetryService;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import jakarta.inject.Inject;
import jakarta.annotation.PostConstruct;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.logging.Logger;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * Bean JSF pour l'historique des adhésions
 * 
 * @author UnionFlow Team
 * @version 1.0
 */
@Named("adhesionHistoriqueBean")
@ViewScoped
public class AdhesionHistoriqueBean implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(AdhesionHistoriqueBean.class);
    
    @Inject
    @RestClient
    private AdhesionService adhesionService;
    
    @Inject
    ErrorHandlerService errorHandler;
    
    @Inject
    RetryService retryService;
    
    // Données
    private List<AdhesionResponse> adhesions = new ArrayList<>();
    private AdhesionResponse adhesionSelectionnee;
    
    // Filtres
    private String statutFiltre;
    private UUID membreIdFiltre;
    private UUID organisationIdFiltre;
    
    // Pagination
    private int page = 0;
    private int pageSize = 20;
    private int totalPages = 0;
    
    @PostConstruct
    public void init() {
        chargerAdhesions();
    }
    
    public void chargerAdhesions() {
        try {
            // Utiliser le filtre de statut si défini
            if (statutFiltre != null && !statutFiltre.trim().isEmpty()) {
                adhesions = retryService.executeWithRetrySupplier(
                    () -> adhesionService.obtenirParStatut(statutFiltre, page, pageSize),
                    "chargement des adhésions par statut"
                );
            } else {
                adhesions = retryService.executeWithRetrySupplier(
                    () -> adhesionService.listerToutes(page, pageSize),
                    "chargement des adhésions"
                );
            }
            LOG.infof("Adhésions chargées: %d (page %d)", adhesions.size(), page);
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors du chargement des adhésions");
            adhesions = new ArrayList<>();
            errorHandler.handleException(e, "lors du chargement des adhésions", null);
        }
    }
    
    public void voirDetails() {
        if (adhesionSelectionnee == null || adhesionSelectionnee.getId() == null) {
            errorHandler.showWarning("Attention", "Aucune adhésion sélectionnée");
            return;
        }
        
        try {
            adhesionSelectionnee = retryService.executeWithRetrySupplier(
                () -> adhesionService.obtenirParId(adhesionSelectionnee.getId()),
                "chargement des détails d'une adhésion"
            );
            LOG.infof("Détails de l'adhésion chargés: %s", adhesionSelectionnee.getId());
        } catch (Exception e) {
            LOG.errorf(e, "Erreur lors de la récupération de l'adhésion");
            errorHandler.handleException(e, "lors du chargement des détails de l'adhésion", null);
        }
    }
    
    public void filtrer() {
        page = 0;
        chargerAdhesions();
        errorHandler.showInfo("Filtre appliqué", adhesions.size() + " adhésion(s) trouvée(s)");
    }
    
    /**
     * Réinitialise les filtres
     */
    public void reinitialiserFiltres() {
        statutFiltre = null;
        membreIdFiltre = null;
        organisationIdFiltre = null;
        page = 0;
        chargerAdhesions();
        errorHandler.showSuccess("Filtres réinitialisés", "Tous les filtres ont été réinitialisés");
    }
    
    /**
     * Actualise les données depuis le backend
     */
    public void actualiser() {
        chargerAdhesions();
        errorHandler.showSuccess("Actualisation", "Données actualisées");
    }
    
    public void pageSuivante() {
        if (page < totalPages - 1) {
            page++;
            chargerAdhesions();
        }
    }
    
    public void pagePrecedente() {
        if (page > 0) {
            page--;
            chargerAdhesions();
        }
    }
    
    // Getters et Setters
    public List<AdhesionResponse> getAdhesions() { return adhesions; }
    public void setAdhesions(List<AdhesionResponse> adhesions) { this.adhesions = adhesions; }

    public AdhesionResponse getAdhesionSelectionnee() { return adhesionSelectionnee; }
    public void setAdhesionSelectionnee(AdhesionResponse adhesionSelectionnee) { this.adhesionSelectionnee = adhesionSelectionnee; }
    
    public String getStatutFiltre() { return statutFiltre; }
    public void setStatutFiltre(String statutFiltre) { this.statutFiltre = statutFiltre; }
    
    public UUID getMembreIdFiltre() { return membreIdFiltre; }
    public void setMembreIdFiltre(UUID membreIdFiltre) { this.membreIdFiltre = membreIdFiltre; }
    
    public UUID getOrganisationIdFiltre() { return organisationIdFiltre; }
    public void setOrganisationIdFiltre(UUID organisationIdFiltre) { this.organisationIdFiltre = organisationIdFiltre; }
    
    public int getPage() { return page; }
    public void setPage(int page) { this.page = page; }
    
    public int getPageSize() { return pageSize; }
    public void setPageSize(int pageSize) { this.pageSize = pageSize; }
}

