package dev.lions.unionflow.client.bean;

import dev.lions.unionflow.client.view.UserSession;
import jakarta.enterprise.context.SessionScoped;
import jakarta.inject.Named;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.inject.Inject;

import java.io.Serializable;
import java.util.Set;

/**
 * Bean de gestion de la visibilité des menus en fonction des rôles utilisateur.
 *
 * <p>Fournit des méthodes utilitaires pour déterminer quels menus afficher
 * selon le rôle de l'utilisateur connecté et le type de son organisation.
 *
 * <p>Utilise {@link SecurityIdentity} pour l'authentification OIDC en mode web-app,
 * en cohérence avec {@link dev.lions.unionflow.client.view.LoginBean}.
 *
 * @author UnionFlow Team
 * @version 1.1
 * @since 2026-03-01
 */
@Named
@SessionScoped
public class MenuBean implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    SecurityIdentity securityIdentity;

    @Inject
    UserSession userSession;

    /**
     * Vérifie si l'utilisateur a au moins un des rôles spécifiés.
     *
     * @param roles Les rôles à vérifier
     * @return true si l'utilisateur possède au moins un des rôles, false sinon
     */
    private boolean hasAnyRole(String... roles) {
        if (securityIdentity == null || securityIdentity.isAnonymous()) {
            return false;
        }

        Set<String> userRoles = securityIdentity.getRoles();
        if (userRoles == null || userRoles.isEmpty()) {
            return false;
        }

        for (String role : roles) {
            if (userRoles.contains(role)) {
                return true;
            }
        }
        return false;
    }

    // ========================================================================
    // MENUS PRINCIPAUX - Visibilité par rôle
    // ========================================================================

    /**
     * Super Administration - Visible uniquement pour SUPER_ADMIN
     */
    public boolean isSuperAdminMenuVisible() {
        return hasAnyRole("SUPER_ADMIN");
    }

    /**
     * Administration - Visible pour admins et secrétaires
     */
    public boolean isAdministrationMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU");
    }

    // ========================================================================
    // NOUVEAUX MENUS PERSONNELS - Visible pour TOUS les membres
    // ========================================================================

    /**
     * Mes Finances - Menu personnel pour consulter/gérer ses propres finances
     * Visible pour TOUS les membres (épargne, cotisations, prêts)
     */
    public boolean isMesFinancesMenuVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Événements - Calendrier et inscriptions aux événements
     * Visible pour TOUS les membres
     */
    public boolean isMesEvenementsMenuVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes Demandes d'Aide Sociale - Menu personnel pour les demandes d'aide
     * Visible pour TOUS les membres
     */
    public boolean isMesAidesSocialesMenuVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes Formations - Catalogue et inscriptions aux formations
     * Visible pour TOUS les membres
     */
    public boolean isMesFormationsMenuVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes Communications - Messages et notifications personnelles
     * Visible pour TOUS les membres
     */
    public boolean isMesCommunicationsMenuVisible() {
        return !securityIdentity.isAnonymous();
    }

    // ========================================================================
    // MENUS DE GESTION - Visible pour les responsables uniquement
    // ========================================================================

    /**
     * Gestion des Membres - Administration des membres
     * Visible pour SECRETAIRE et ADMIN uniquement
     */
    public boolean isGestionMembresMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE");
    }

    /**
     * Annuaire des Membres - Consultation de la liste (pas de modification)
     * Visible pour les responsables et bureau SEULEMENT (PAS pour MEMBRE_ACTIF)
     *
     * Raison métier: Un membre simple n'a généralement pas besoin de voir la liste complète
     * des autres membres. Cela peut poser des problèmes de:
     * - RGPD: Exposition non justifiée de données personnelles
     * - Sécurité: Risque de spam/phishing entre membres
     * - UX: Surcharge du menu pour un usage limité
     *
     * Si l'organisation souhaite activer l'annuaire pour MEMBRE_ACTIF, cela doit être
     * fait via configuration explicite (future Phase 3).
     */
    public boolean isAnnuaireMembresVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "TRESORIER",
                         "RESPONSABLE_SOCIAL", "RESPONSABLE_EVENEMENTS", "RESPONSABLE_CREDIT",
                         "MEMBRE_BUREAU");
        // MEMBRE_ACTIF retiré intentionnellement pour raisons UX et RGPD
    }

    /**
     * Gestion Financière - Administration finances (trésorerie, budgets, comptabilité)
     * Visible pour TRESORIER et ADMIN uniquement
     */
    public boolean isGestionFinancesMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER");
    }

    /**
     * Gestion Événements - Création et organisation des événements
     * Visible pour RESPONSABLE_EVENEMENTS, SECRETAIRE et ADMIN
     */
    public boolean isGestionEvenementsMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "RESPONSABLE_EVENEMENTS");
    }

    /**
     * Gestion Aide Sociale - Traitement des demandes d'aide
     * Visible pour RESPONSABLE_SOCIAL et ADMIN
     */
    public boolean isGestionAidesSocialesMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL");
    }

    /**
     * Organisations - Visible pour admins et super-admins
     */
    public boolean isOrganisationsMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION");
    }

    /**
     * Adhésions - Visible pour admins, secrétaires, bureau
     */
    public boolean isAdhesionsMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU");
    }

    /**
     * Communication - Visible pour admins, secrétaires, bureau
     */
    public boolean isCommunicationMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "RESPONSABLE_EVENEMENTS", "MEMBRE_BUREAU");
    }

    /**
     * Documents - Visible pour tous sauf membres simples
     */
    public boolean isDocumentsMenuVisible() {
        return !hasAnyRole("MEMBRE_SIMPLE");
    }

    /**
     * Formation - Visible pour tous les membres actifs et plus
     */
    public boolean isFormationMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU", "MEMBRE_ACTIF");
    }

    /**
     * Rapports et Analyses - Visible pour admins, trésoriers, secrétaires, bureau
     */
    public boolean isRapportsMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "SECRETAIRE", "MEMBRE_BUREAU");
    }

    /**
     * Outils et Utilitaires - Visible pour admins et secrétaires
     */
    public boolean isOutilsMenuVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU");
    }

    /**
     * Mon Espace Personnel - Visible pour tous les utilisateurs connectés
     */
    public boolean isPersonnelMenuVisible() {
        return true; // Tous les utilisateurs connectés
    }

    /**
     * Aide et Support - Visible pour tous
     */
    public boolean isAideMenuVisible() {
        return true; // Tous les utilisateurs
    }

    // ========================================================================
    // ITEMS DE MENUS PERSONNELS - Actions membre
    // ========================================================================

    /**
     * Consulter mon épargne - Visible pour TOUS
     */
    public boolean isMonEpargneVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Payer mes cotisations - Visible pour TOUS
     */
    public boolean isPaiementCotisationVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Demander un prêt/crédit - Visible pour TOUS
     */
    public boolean isDemandePretVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes prêts en cours - Visible pour TOUS
     */
    public boolean isMesPretsVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Demander une aide sociale - Visible pour TOUS
     */
    public boolean isDemandeAideSocialeVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes demandes d'aide en cours - Visible pour TOUS
     */
    public boolean isMesDemandesAideVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * M'inscrire à un événement - Visible pour TOUS
     */
    public boolean isInscriptionEvenementVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes inscriptions aux événements - Visible pour TOUS
     */
    public boolean isMesInscriptionsEvenementsVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * M'inscrire à une formation - Visible pour TOUS
     */
    public boolean isInscriptionFormationVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes formations - Visible pour TOUS
     */
    public boolean isMesFormationsVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Mes messages personnels - Visible pour TOUS
     */
    public boolean isMesMessagesVisible() {
        return !securityIdentity.isAnonymous();
    }

    /**
     * Annonces officielles (lecture seule) - Visible pour TOUS
     */
    public boolean isAnnoncesLectureVisible() {
        return !securityIdentity.isAnonymous();
    }

    // ========================================================================
    // ITEMS DE MENUS SPÉCIFIQUES - Administration
    // ========================================================================

    /**
     * Items Keycloak User Manager - Visible uniquement pour SUPER_ADMIN
     */
    public boolean isKeycloakUserManagerVisible() {
        return hasAnyRole("SUPER_ADMIN");
    }

    /**
     * Gestion des cotisations (admin) - Visible pour admins et trésoriers
     */
    public boolean isCotisationsAdminVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER");
    }

    /**
     * Comptabilité - Visible pour admins et trésoriers
     */
    public boolean isComptabiliteVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER");
    }

    /**
     * Trésorerie - Visible pour admins et trésoriers
     */
    public boolean isTresorerieVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER");
    }

    /**
     * Épargne/Crédit (spécifique mutuelles) - Visible pour trésoriers et responsables crédit
     */
    public boolean isEpargneCreditVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "RESPONSABLE_CREDIT");
    }

    /**
     * Inscription de membres - Visible pour admins et secrétaires
     */
    public boolean isInscriptionMembreVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE");
    }

    /**
     * Import/Export de membres - Visible pour admins et secrétaires
     */
    public boolean isImportExportMembreVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE");
    }

    /**
     * Validation des adhésions - Visible pour admins et secrétaires
     */
    public boolean isValidationAdhesionVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE");
    }

    /**
     * Traitement des demandes d'aide - Visible pour admins et responsables sociaux
     */
    public boolean isTraitementAideVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL");
    }

    /**
     * Évaluation sociale - Visible pour responsables sociaux
     */
    public boolean isEvaluationSocialeVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL");
    }

    /**
     * Création d'événements - Visible pour admins et responsables événements
     */
    public boolean isCreationEvenementVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_EVENEMENTS", "SECRETAIRE");
    }

    /**
     * Logistique événements - Visible pour responsables événements
     */
    public boolean isLogistiqueEvenementVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_EVENEMENTS");
    }

    /**
     * Envoi SMS/Email - Visible pour admins et secrétaires
     */
    public boolean isCommunicationMasseVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE");
    }

    /**
     * Sauvegardes et maintenance - Visible uniquement pour SUPER_ADMIN
     */
    public boolean isMaintenanceVisible() {
        return hasAnyRole("SUPER_ADMIN");
    }

    /**
     * Rapports financiers - Visible pour admins et trésoriers
     */
    public boolean isRapportFinancierVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER");
    }

    /**
     * Exports personnalisés - Visible pour admins, trésoriers, secrétaires
     */
    public boolean isExportsPersonnalisesVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "SECRETAIRE");
    }

    // ========================================================================
    // HELPERS
    // ========================================================================

    /**
     * Vérifie si l'utilisateur est un super-admin
     */
    public boolean isSuperAdmin() {
        return hasAnyRole("SUPER_ADMIN");
    }

    /**
     * Vérifie si l'utilisateur est un admin d'organisation
     */
    public boolean isAdminOrganisation() {
        return hasAnyRole("ADMIN_ORGANISATION");
    }

    /**
     * Vérifie si l'utilisateur est un trésorier
     */
    public boolean isTresorier() {
        return hasAnyRole("TRESORIER");
    }

    /**
     * Vérifie si l'utilisateur est un secrétaire
     */
    public boolean isSecretaire() {
        return hasAnyRole("SECRETAIRE");
    }

    /**
     * Vérifie si l'utilisateur est un responsable social
     */
    public boolean isResponsableSocial() {
        return hasAnyRole("RESPONSABLE_SOCIAL");
    }

    /**
     * Vérifie si l'utilisateur est un responsable événements
     */
    public boolean isResponsableEvenements() {
        return hasAnyRole("RESPONSABLE_EVENEMENTS");
    }

    /**
     * Vérifie si l'utilisateur est un responsable crédit
     */
    public boolean isResponsableCredit() {
        return hasAnyRole("RESPONSABLE_CREDIT");
    }

    /**
     * Vérifie si l'utilisateur est membre du bureau
     */
    public boolean isMembreBureau() {
        return hasAnyRole("MEMBRE_BUREAU");
    }

    /**
     * Vérifie si l'utilisateur est membre actif
     */
    public boolean isMembreActif() {
        return hasAnyRole("MEMBRE_ACTIF");
    }

    /**
     * Vérifie si l'utilisateur est membre simple
     */
    public boolean isMembreSimple() {
        return hasAnyRole("MEMBRE_SIMPLE");
    }

    // ========================================================================
    // MENUS PAR MODULE (conditionnels selon le type d'organisation active)
    // Chaque méthode combine : rôle requis + module actif dans l'org active.
    // Un SUPERADMIN voit tout sans restriction de module.
    // ========================================================================

    /**
     * Vérifie si un module est actif pour l'organisation courante.
     * Les SUPER_ADMIN voient tous les modules.
     */
    private boolean hasModule(String module) {
        if (hasAnyRole("SUPER_ADMIN")) return true;
        if (userSession == null) return false;
        return userSession.hasModuleActif(module);
    }

    /** Menu Tontine — visible si module TONTINE actif + rôle adéquat. */
    public boolean isTontineMenuVisible() {
        return hasModule("TONTINE") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER",
                           "TONTINE_RESP", "TONTINE_MANAGER", "TONTINE_COLLECTOR");
    }

    /** Menu Tontine (membres) — consultation de ses propres tontines. */
    public boolean isTontineMemberVisible() {
        return hasModule("TONTINE") && !securityIdentity.isAnonymous();
    }

    /** Menu Épargne — visible si module EPARGNE actif. */
    public boolean isEpargneMenuVisible() {
        return hasModule("EPARGNE") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER",
                           "MUTUELLE_RESP", "EPARGNE_MANAGER");
    }

    /** Menu Épargne (membres). */
    public boolean isEpargneMemberVisible() {
        return hasModule("EPARGNE") && !securityIdentity.isAnonymous();
    }

    /** Menu Crédit — visible si module CREDIT actif. */
    public boolean isCreditMenuVisible() {
        return hasModule("CREDIT") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER",
                           "MUTUELLE_RESP", "CREDIT_ANALYSTE", "RESPONSABLE_CREDIT");
    }

    /** Menu Crédit (membres). */
    public boolean isCreditMemberVisible() {
        return hasModule("CREDIT") && !securityIdentity.isAnonymous();
    }

    /** Menu Agriculture / Campagnes — visible si module AGRICULTURE actif. */
    public boolean isAgricoleMenuVisible() {
        return hasModule("AGRICULTURE") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COOP_RESP");
    }

    /** Menu Agriculture (membres). */
    public boolean isAgricoleMemberVisible() {
        return hasModule("AGRICULTURE") && !securityIdentity.isAnonymous();
    }

    /** Menu Collecte de fonds — visible si module COLLECTE_FONDS actif. */
    public boolean isCollecteFondsMenuVisible() {
        return hasModule("COLLECTE_FONDS") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COLLECTE_RESP");
    }

    /** Menu Projets ONG — visible si module PROJETS_ONG actif. */
    public boolean isProjetOngMenuVisible() {
        return hasModule("PROJETS_ONG") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "ONG_RESP", "PROJET_MANAGER");
    }

    /** Menu Culte / Dons religieux — visible si module CULTE_DONS actif. */
    public boolean isCulteMenuVisible() {
        return hasModule("CULTE_DONS") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "CULTE_RESP", "PASTEUR", "DIACRE");
    }

    /** Menu Vote — visible si module VOTES actif. */
    public boolean isVoteMenuVisible() {
        return hasModule("VOTES") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "VOTE_RESP", "SCRUTATEUR");
    }

    /** Menu Registre / Agrément — visible si module REGISTRE_AGREMENT actif. */
    public boolean isRegistreAgrementMenuVisible() {
        return hasModule("REGISTRE_AGREMENT") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "REGISTRE_RESP");
    }

    /** Menu Gouvernance / Organigramme — visible si module GOUVERNANCE actif. */
    public boolean isGouvernanceMenuVisible() {
        return hasModule("GOUVERNANCE") &&
               hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION");
    }

    // ========================================================================
    // Pages conformité (Sprint 8 — backend P1-NEW-7 / P2-NEW-3 / P1-NEW-15)
    // ========================================================================

    /**
     * Tableau de bord conformité — Compliance Officer / Contrôleur Interne / direction.
     * @since 2026-04-25
     */
    public boolean isConformiteDashboardVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT",
            "TRESORIER", "COMPLIANCE_OFFICER", "CONTROLEUR_INTERNE");
    }

    /**
     * Rapports trimestriels Contrôleur Interne — restreint contrôleur + président + admin.
     * @since 2026-04-25
     */
    public boolean isRapportsTrimestrielsVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT",
            "CONTROLEUR_INTERNE");
    }

    /**
     * PI-SPI Readiness — admin technique uniquement.
     * @since 2026-04-25
     */
    public boolean isPispiReadinessVisible() {
        return hasAnyRole("SUPER_ADMIN", "COMPLIANCE_OFFICER");
    }

    /**
     * Bénéficiaires Effectifs (UBO) — Instr. BCEAO 003-03-2025.
     * @since 2026-04-25 (Sprint 11)
     */
    public boolean isBeneficiairesEffectifsVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COMPLIANCE_OFFICER",
            "CONTROLEUR_INTERNE");
    }

    /**
     * Audit Trail viewer — compliance / contrôle interne.
     * @since 2026-04-25 (Sprint 11)
     */
    public boolean isAuditTrailViewerVisible() {
        return hasAnyRole("SUPER_ADMIN", "COMPLIANCE_OFFICER", "CONTROLEUR_INTERNE");
    }

    /**
     * Délégations de rôles — admin org / président.
     * @since 2026-04-25 (Sprint 11)
     */
    public boolean isRoleDelegationsVisible() {
        return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT");
    }

    /**
     * Retourne true si l'organisation active dispose d'au moins un module métier spécifique
     * (au-delà des modules communs toujours disponibles).
     * Utilisé pour afficher/masquer la section "Modules métier" dans la navigation.
     */
    public boolean hasAnyBusinessModule() {
        if (hasAnyRole("SUPER_ADMIN")) return true;
        return isTontineMenuVisible() || isCreditMenuVisible() || isEpargneMenuVisible()
            || isAgricoleMenuVisible() || isCollecteFondsMenuVisible()
            || isProjetOngMenuVisible() || isCulteMenuVisible()
            || isVoteMenuVisible() || isRegistreAgrementMenuVisible()
            || isGouvernanceMenuVisible();
    }
}
