package dev.lions.unionflow.client.view;

import dev.lions.unionflow.client.dto.AssociationDTO;
import dev.lions.unionflow.client.service.AssociationService;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import java.io.IOException;
import java.io.Serializable;
import java.util.UUID;
import java.util.logging.Logger;
import org.eclipse.microprofile.rest.client.inject.RestClient;

/**
 * Bean de consultation d'une organisation (fiche détaillée en lecture seule).
 */
@Named("organisationDetailBean")
@ViewScoped
public class OrganisationDetailBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger LOGGER = Logger.getLogger(OrganisationDetailBean.class.getName());

    @Inject
    @RestClient
    AssociationService associationService;

    private AssociationDTO organisation;

    private UUID organisationId;

    @PostConstruct
    public void init() {
        // Récupérer l'ID depuis les paramètres de requête
        String idParam = FacesContext.getCurrentInstance()
                .getExternalContext()
                .getRequestParameterMap()
                .get("id");

        if (idParam != null && !idParam.isBlank()) {
            try {
                organisationId = UUID.fromString(idParam);
                chargerOrganisation();
            } catch (IllegalArgumentException e) {
                LOGGER.severe("ID d'organisation invalide: " + idParam);
                ajouterMessageErreur("Organisation introuvable", "Identifiant invalide.");
            }
        } else {
            ajouterMessageErreur("Organisation introuvable", "Aucun identifiant fourni.");
        }
    }

    public void chargerOrganisation() {
        if (organisationId == null) {
            return;
        }
        try {
            organisation = associationService.obtenirParId(organisationId);
        } catch (Exception e) {
            LOGGER.severe("Erreur lors du chargement de l'organisation: " + e.getMessage());
            ajouterMessageErreur("Organisation introuvable",
                    "Impossible de charger les détails de l'organisation.");
        }
    }

    public void revenirAListe() throws IOException {
        FacesContext.getCurrentInstance()
                .getExternalContext()
                .redirect(FacesContext.getCurrentInstance()
                        .getExternalContext()
                        .getRequestContextPath() + "/pages/secure/organisation/liste.xhtml");
    }

    private void ajouterMessageErreur(String resume, String detail) {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR, resume, detail));
    }

    public AssociationDTO getOrganisation() {
        return organisation;
    }
}


