package dev.lions.unionflow.server.security;

import dev.lions.unionflow.server.entity.Organisation;
import jakarta.enterprise.context.RequestScoped;
import java.util.UUID;

/**
 * Holder request-scoped contenant l'organisation active résolue pour la requête courante.
 *
 * <p>Peuplé par {@link OrganisationContextFilter} à partir du header
 * {@code X-Active-Organisation-Id}. Utilisé par les services métier pour
 * scoper toutes les opérations à l'organisation active.
 *
 * <p>Exemple d'utilisation dans un service :
 * <pre>{@code
 *   @Inject OrganisationContextHolder orgContext;
 *
 *   public List<Tontine> listTontines() {
 *       UUID orgId = orgContext.getOrganisationId();
 *       return tontineRepository.findByOrganisationId(orgId);
 *   }
 * }</pre>
 */
@RequestScoped
public class OrganisationContextHolder {

    private UUID organisationId;
    private Organisation organisation;
    private boolean resolved = false;

    /** Rôle actif sélectionné par le user pour cette requête (header X-Active-Role). */
    private String roleActif;

    /** UUID de l'utilisateur courant (sub du JWT). */
    private UUID currentUserId;

    /** Email de l'utilisateur courant (claim email du JWT). */
    private String currentUserEmail;

    public String getRoleActif() {
        return roleActif;
    }

    public void setRoleActif(String roleActif) {
        this.roleActif = roleActif;
    }

    public UUID getCurrentUserId() {
        return currentUserId;
    }

    public void setCurrentUserId(UUID currentUserId) {
        this.currentUserId = currentUserId;
    }

    public String getCurrentUserEmail() {
        return currentUserEmail;
    }

    public void setCurrentUserEmail(String currentUserEmail) {
        this.currentUserEmail = currentUserEmail;
    }

    public UUID getOrganisationId() {
        return organisationId;
    }

    public void setOrganisationId(UUID organisationId) {
        this.organisationId = organisationId;
    }

    public Organisation getOrganisation() {
        return organisation;
    }

    public void setOrganisation(Organisation organisation) {
        this.organisation = organisation;
    }

    public boolean isResolved() {
        return resolved;
    }

    public void setResolved(boolean resolved) {
        this.resolved = resolved;
    }

    /**
     * Retourne true si un contexte d'organisation est disponible.
     */
    public boolean hasContext() {
        return resolved && organisationId != null;
    }
}
