<?php

namespace App\Helpers;

/**
 * Helper centralisé pour la gestion des rôles utilisateurs
 * 
 * STRUCTURE DES RÔLES:
 * 
 * 1. ADMINISTRATION (Accès back-office complet)
 *    - super_admin: Super administrateur (contrôle total)
 *    - admin: Administrateur
 *    - sub_admin: Sous-administrateur
 * 
 * 2. BACK-OFFICE (Accès back-office limité)
 *    - comptabilite: Comptabilité
 *    - accountant: Comptable (alias)
 *    - marketing: Marketing
 *    - community_manager: Community Manager
 *    - verifier: Vérificateur (livraisons)
 * 
 * 3. COMMERCE
 *    - seller: Vendeur (avec boutique)
 * 
 * 4. UTILISATEURS FRONT
 *    - member: Membre MLM (abonné)
 *    - affiliate: Affilié
 *    - user: Utilisateur standard
 */
class RoleHelper
{
    /**
     * Liste complète de tous les rôles avec leurs labels
     */
    public const ALL_ROLES = [
        // Administration
        'super_admin' => 'Super Administrateur',
        'admin' => 'Administrateur',
        'sub_admin' => 'Sous-Administrateur',
        
        // Back-office
        'comptabilite' => 'Comptabilité',
        'accountant' => 'Comptable',
        'marketing' => 'Marketing',
        'community_manager' => 'Community Manager',
        'verifier' => 'Vérificateur',
        
        // Commerce
        'seller' => 'Vendeur',
        
        // Utilisateurs front
        'member' => 'Membre MLM',
        'affiliate' => 'Affilié',
        'user' => 'Utilisateur',
    ];

    /**
     * Rôles administration (accès back-office complet)
     */
    public const ADMIN_ROLES = ['super_admin', 'admin', 'sub_admin'];

    /**
     * Rôles back-office (accès back-office limité)
     */
    public const BACKOFFICE_ROLES = ['comptabilite', 'accountant', 'marketing', 'community_manager', 'verifier'];

    /**
     * Tous les rôles autorisés à accéder au back-office
     */
    public const ALLOWED_BACKOFFICE = ['super_admin', 'admin', 'sub_admin', 'comptabilite', 'accountant', 'marketing', 'community_manager', 'verifier'];

    /**
     * Rôles commerce
     */
    public const COMMERCE_ROLES = ['seller'];

    /**
     * Rôles utilisateurs front
     */
    public const USER_ROLES = ['member', 'affiliate', 'user'];

    /**
     * Rôles membres/affiliés (peuvent parrainer)
     */
    public const MLM_ROLES = ['member', 'affiliate'];

    /**
     * Rôles autorisés pour l'espace membre
     */
    public const ALLOWED_MEMBER_AREA = ['member', 'user', 'affiliate'];

    /**
     * Rôles autorisés à avoir une boutique
     */
    public const ALLOWED_SHOP = ['seller', 'member', 'affiliate', 'user'];

    /**
     * Rôles autorisés pour la comptabilité (+ admins)
     */
    public const ALLOWED_COMPTABILITE = ['comptabilite', 'accountant', 'admin', 'sub_admin', 'super_admin'];

    /**
     * Rôles autorisés pour le marketing (+ admins)
     */
    public const ALLOWED_MARKETING = ['marketing', 'admin', 'sub_admin', 'super_admin'];

    /**
     * Rôles autorisés pour le community management (+ marketing + admins)
     */
    public const ALLOWED_COMMUNITY = ['community_manager', 'marketing', 'admin', 'sub_admin', 'super_admin'];

    /**
     * Rôles autorisés pour la vérification (+ admins)
     */
    public const ALLOWED_VERIFIER = ['verifier', 'admin', 'sub_admin', 'super_admin'];

    /**
     * Obtenir le label d'un rôle
     */
    public static function getLabel(string $role): string
    {
        return self::ALL_ROLES[$role] ?? ucfirst($role);
    }

    /**
     * Obtenir tous les rôles avec leurs labels
     */
    public static function all(): array
    {
        return self::ALL_ROLES;
    }

    /**
     * Obtenir les rôles groupés pour les selects
     */
    public static function grouped(): array
    {
        return [
            'Utilisateurs' => [
                'user' => 'Utilisateur',
                'member' => 'Membre MLM',
                'affiliate' => 'Affilié',
            ],
            'Commerce' => [
                'seller' => 'Vendeur',
            ],
            'Back-Office' => [
                'comptabilite' => 'Comptabilité',
                'accountant' => 'Comptable',
                'marketing' => 'Marketing',
                'community_manager' => 'Community Manager',
                'verifier' => 'Vérificateur',
            ],
            'Administration' => [
                'sub_admin' => 'Sous-Administrateur',
                'admin' => 'Administrateur',
            ],
        ];
    }

    /**
     * Vérifier si un rôle peut accéder au back-office
     */
    public static function canAccessBackoffice(string $role): bool
    {
        return in_array($role, self::ALLOWED_BACKOFFICE);
    }

    /**
     * Vérifier si un rôle est admin
     */
    public static function isAdmin(string $role): bool
    {
        return in_array($role, self::ADMIN_ROLES);
    }

    /**
     * Vérifier si un rôle peut parrainer
     */
    public static function canSponsor(string $role): bool
    {
        return in_array($role, self::MLM_ROLES);
    }

    /**
     * Vérifier si un rôle est vendeur
     */
    public static function isSeller(string $role): bool
    {
        return $role === 'seller';
    }

    /**
     * Obtenir la liste des rôles valides pour la validation
     */
    public static function validationRule(): string
    {
        return 'in:' . implode(',', array_keys(self::ALL_ROLES));
    }

    /**
     * Obtenir le badge de couleur pour un rôle
     */
    public static function getBadgeClass(string $role): string
    {
        return match($role) {
            'super_admin' => 'bg-danger',
            'admin' => 'bg-danger',
            'sub_admin' => 'bg-warning text-dark',
            'comptabilite', 'accountant' => 'bg-info',
            'marketing' => 'bg-purple',
            'community_manager' => 'bg-pink',
            'verifier' => 'bg-secondary',
            'seller' => 'bg-success',
            'member' => 'bg-primary',
            'affiliate' => 'bg-teal',
            'user' => 'bg-light text-dark',
            default => 'bg-secondary',
        };
    }

    /**
     * Vérifier si un rôle peut accéder à l'espace membre
     */
    public static function canAccessMemberArea(string $role): bool
    {
        return in_array($role, self::ALLOWED_MEMBER_AREA);
    }

    /**
     * Vérifier si un rôle peut accéder à la comptabilité
     */
    public static function canAccessComptabilite(string $role): bool
    {
        return in_array($role, self::ALLOWED_COMPTABILITE);
    }

    /**
     * Vérifier si un rôle peut accéder au marketing
     */
    public static function canAccessMarketing(string $role): bool
    {
        return in_array($role, self::ALLOWED_MARKETING);
    }

    /**
     * Vérifier si un rôle peut accéder au community management
     */
    public static function canAccessCommunity(string $role): bool
    {
        return in_array($role, self::ALLOWED_COMMUNITY);
    }

    /**
     * Vérifier si un rôle peut accéder à la vérification
     */
    public static function canAccessVerifier(string $role): bool
    {
        return in_array($role, self::ALLOWED_VERIFIER);
    }

    /**
     * Vérifier si un rôle peut avoir une boutique
     */
    public static function canHaveShop(string $role): bool
    {
        return in_array($role, self::ALLOWED_SHOP);
    }

    /**
     * Vérifier si l'utilisateur est actuellement en mode impersonate
     */
    public static function isImpersonating(): bool
    {
        return session()->has('impersonator.id');
    }

    /**
     * Obtenir l'ID de l'administrateur qui impersone
     */
    public static function getImpersonatorId(): ?int
    {
        return session()->get('impersonator.id');
    }
}
