/// Système de rôles utilisateurs avec hiérarchie intelligente
/// 6 niveaux de rôles avec permissions héritées et contextuelles
library user_role;

import 'permission_matrix.dart';

/// Énumération des rôles utilisateurs avec hiérarchie et permissions
/// 
/// Chaque rôle a un niveau numérique pour faciliter les comparaisons
/// et une liste de permissions spécifiques avec héritage intelligent
enum UserRole {
  /// Super Administrateur - Niveau système (100)
  /// Accès complet à toutes les fonctionnalités multi-organisations
  superAdmin(
    level: 100,
    displayName: 'Super Administrateur',
    description: 'Accès complet système et multi-organisations',
    color: 0xFF6C5CE7, // Violet sophistiqué
    permissions: _superAdminPermissions,
  ),

  /// Administrateur d'Organisation - Niveau organisation (80)
  /// Gestion complète de son organisation uniquement
  orgAdmin(
    level: 80,
    displayName: 'Administrateur',
    description: 'Gestion complète de l\'organisation',
    color: 0xFF0984E3, // Bleu corporate
    permissions: _orgAdminPermissions,
  ),

  /// Modérateur/Gestionnaire - Niveau intermédiaire (60)
  /// Gestion partielle selon permissions accordées
  moderator(
    level: 60,
    displayName: 'Modérateur',
    description: 'Gestion partielle et modération',
    color: 0xFFE17055, // Orange focus
    permissions: _moderatorPermissions,
  ),

  /// Consultant - Niveau intermédiaire (58)
  /// Accès consultant / conseil
  consultant(
    level: 58,
    displayName: 'Consultant',
    description: 'Accès consultant et conseil',
    color: 0xFF6C5CE7, // Violet
    permissions: _consultantPermissions,
  ),

  /// Gestionnaire RH - Niveau intermédiaire (52)
  /// Gestion des ressources humaines
  hrManager(
    level: 52,
    displayName: 'Gestionnaire RH',
    description: 'Gestion des ressources humaines',
    color: 0xFF0984E3, // Bleu
    permissions: _hrManagerPermissions,
  ),

  /// Membre Actif - Niveau utilisateur (40)
  /// Accès aux fonctionnalités membres avec participation active
  activeMember(
    level: 40,
    displayName: 'Membre Actif',
    description: 'Participation active aux activités',
    color: 0xFF00B894, // Vert communauté
    permissions: _activeMemberPermissions,
  ),

  /// Membre Simple - Niveau basique (20)
  /// Accès limité aux informations personnelles
  simpleMember(
    level: 20,
    displayName: 'Membre',
    description: 'Accès aux informations de base',
    color: 0xFF00CEC9, // Teal simple
    permissions: _simpleMemberPermissions,
  ),

  /// Visiteur/Invité - Niveau public (0)
  /// Accès aux informations publiques uniquement
  visitor(
    level: 0,
    displayName: 'Visiteur',
    description: 'Accès aux informations publiques',
    color: 0xFF6C5CE7, // Indigo accueillant
    permissions: _visitorPermissions,
  );

  /// Constructeur du rôle avec toutes ses propriétés
  const UserRole({
    required this.level,
    required this.displayName,
    required this.description,
    required this.color,
    required this.permissions,
  });

  /// Niveau numérique du rôle (0-100)
  final int level;
  
  /// Nom d'affichage du rôle
  final String displayName;
  
  /// Description détaillée du rôle
  final String description;
  
  /// Couleur thématique du rôle (format 0xFFRRGGBB)
  final int color;
  
  /// Liste des permissions spécifiques au rôle
  final List<String> permissions;

  /// Vérifie si ce rôle a un niveau supérieur ou égal à un autre
  bool hasLevelOrAbove(UserRole other) => level >= other.level;

  /// Vérifie si ce rôle a un niveau strictement supérieur à un autre
  bool hasLevelAbove(UserRole other) => level > other.level;

  /// Vérifie si ce rôle possède une permission spécifique
  bool hasPermission(String permission) {
    // Vérification directe
    if (permissions.contains(permission)) return true;
    
    // Vérification par héritage (permissions impliquées)
    return permissions.any((p) => PermissionMatrix.implies(p, permission));
  }

  /// Obtient toutes les permissions effectives (directes + héritées)
  List<String> getEffectivePermissions() {
    final effective = <String>{};
    
    // Ajouter les permissions directes
    effective.addAll(permissions);
    
    // Ajouter les permissions impliquées
    for (final permission in permissions) {
      for (final allPermission in PermissionMatrix.ALL_PERMISSIONS) {
        if (PermissionMatrix.implies(permission, allPermission)) {
          effective.add(allPermission);
        }
      }
    }
    
    return effective.toList()..sort();
  }

  /// Vérifie si ce rôle peut effectuer une action sur un domaine
  bool canPerformAction(String domain, String action, {String scope = 'own'}) {
    final permission = '$domain.$action.$scope';
    return hasPermission(permission);
  }

  /// Obtient le rôle à partir de son nom
  static UserRole? fromString(String roleName) {
    return UserRole.values.firstWhere(
      (role) => role.name == roleName,
      orElse: () => UserRole.visitor,
    );
  }

  /// Obtient tous les rôles avec un niveau inférieur ou égal
  List<UserRole> getSubordinateRoles() {
    return UserRole.values.where((role) => role.level < level).toList();
  }

  /// Obtient tous les rôles avec un niveau supérieur ou égal
  List<UserRole> getSuperiorRoles() {
    return UserRole.values.where((role) => role.level >= level).toList();
  }
}

// === DÉFINITIONS DES PERMISSIONS PAR RÔLE ===

/// Permissions du Super Administrateur (accès complet)
const List<String> _superAdminPermissions = [
  // Toutes les permissions système
  PermissionMatrix.SYSTEM_ADMIN,
  PermissionMatrix.SYSTEM_CONFIG,
  PermissionMatrix.SYSTEM_MONITORING,
  PermissionMatrix.SYSTEM_BACKUP,
  PermissionMatrix.SYSTEM_SECURITY,
  PermissionMatrix.SYSTEM_AUDIT,
  PermissionMatrix.SYSTEM_LOGS,
  PermissionMatrix.SYSTEM_MAINTENANCE,
  
  // Gestion globale des organisations
  PermissionMatrix.ORG_CREATE,
  PermissionMatrix.ORG_DELETE,
  PermissionMatrix.ORG_CONFIG,
  
  // Accès complet aux dashboards
  PermissionMatrix.DASHBOARD_ADMIN,
  PermissionMatrix.DASHBOARD_ANALYTICS,
  PermissionMatrix.DASHBOARD_REPORTS,
  PermissionMatrix.DASHBOARD_EXPORT,
  
  // Gestion complète des membres
  PermissionMatrix.MEMBERS_VIEW_ALL,
  PermissionMatrix.MEMBERS_EDIT_ALL,
  PermissionMatrix.MEMBERS_DELETE,
  PermissionMatrix.MEMBERS_EXPORT,
  PermissionMatrix.MEMBERS_IMPORT,
  
  // Accès complet aux finances
  PermissionMatrix.FINANCES_VIEW_ALL,
  PermissionMatrix.FINANCES_MANAGE,
  PermissionMatrix.FINANCES_AUDIT,
  
  // Tous les rapports
  PermissionMatrix.REPORTS_VIEW_ALL,
  PermissionMatrix.REPORTS_GENERATE,
  PermissionMatrix.REPORTS_EXPORT,
  PermissionMatrix.REPORTS_SCHEDULE,
];

/// Permissions de l'Administrateur d'Organisation
const List<String> _orgAdminPermissions = [
  // Configuration organisation
  PermissionMatrix.ORG_CONFIG,
  PermissionMatrix.ORG_BRANDING,
  PermissionMatrix.ORG_SETTINGS,
  PermissionMatrix.ORG_PERMISSIONS,
  PermissionMatrix.ORG_WORKFLOWS,
  
  // Dashboard organisation
  PermissionMatrix.DASHBOARD_VIEW,
  PermissionMatrix.DASHBOARD_ANALYTICS,
  PermissionMatrix.DASHBOARD_REPORTS,
  PermissionMatrix.DASHBOARD_CUSTOMIZE,
  
  // Gestion des membres
  PermissionMatrix.MEMBERS_VIEW_ALL,
  PermissionMatrix.MEMBERS_CREATE,
  PermissionMatrix.MEMBERS_EDIT_ALL,
  PermissionMatrix.MEMBERS_APPROVE,
  PermissionMatrix.MEMBERS_SUSPEND,
  PermissionMatrix.MEMBERS_COMMUNICATE,
  
  // Gestion financière
  PermissionMatrix.FINANCES_VIEW_ALL,
  PermissionMatrix.FINANCES_MANAGE,
  PermissionMatrix.FINANCES_REPORTS,
  PermissionMatrix.FINANCES_BUDGET,
  
  // Gestion des événements
  PermissionMatrix.EVENTS_VIEW_ALL,
  PermissionMatrix.EVENTS_CREATE,
  PermissionMatrix.EVENTS_EDIT_ALL,
  PermissionMatrix.EVENTS_DELETE,
  PermissionMatrix.EVENTS_ANALYTICS,
  
  // Gestion de la solidarité
  PermissionMatrix.SOLIDARITY_VIEW_ALL,
  PermissionMatrix.SOLIDARITY_APPROVE,
  PermissionMatrix.SOLIDARITY_MANAGE,
  PermissionMatrix.SOLIDARITY_FUND,
  
  // Communication
  PermissionMatrix.COMM_SEND_ALL,
  PermissionMatrix.COMM_BROADCAST,
  PermissionMatrix.COMM_TEMPLATES,
  
  // Rapports organisation
  PermissionMatrix.REPORTS_GENERATE,
  PermissionMatrix.REPORTS_EXPORT,
];

/// Permissions du Modérateur
const List<String> _moderatorPermissions = [
  // Dashboard limité
  PermissionMatrix.DASHBOARD_VIEW,
  
  // Modération des membres
  PermissionMatrix.MEMBERS_VIEW_ALL,
  PermissionMatrix.MEMBERS_APPROVE,
  PermissionMatrix.MODERATION_USERS,
  
  // Modération du contenu
  PermissionMatrix.MODERATION_CONTENT,
  PermissionMatrix.MODERATION_REPORTS,
  
  // Événements limités
  PermissionMatrix.EVENTS_VIEW_ALL,
  PermissionMatrix.EVENTS_MODERATE,
  
  // Communication modérée
  PermissionMatrix.COMM_MODERATE,
  PermissionMatrix.COMM_SEND_MEMBERS,
];

/// Permissions du Consultant
const List<String> _consultantPermissions = [
  PermissionMatrix.DASHBOARD_VIEW,
  PermissionMatrix.DASHBOARD_ANALYTICS,
  PermissionMatrix.MEMBERS_VIEW_ALL,
  PermissionMatrix.EVENTS_VIEW_ALL,
  PermissionMatrix.REPORTS_VIEW_ALL,
  PermissionMatrix.REPORTS_GENERATE,
];

/// Permissions du Gestionnaire RH
const List<String> _hrManagerPermissions = [
  PermissionMatrix.DASHBOARD_VIEW,
  PermissionMatrix.MEMBERS_VIEW_ALL,
  PermissionMatrix.MEMBERS_EDIT_BASIC,
  PermissionMatrix.MEMBERS_APPROVE,
  PermissionMatrix.EVENTS_VIEW_ALL,
  PermissionMatrix.MODERATION_USERS,
];

/// Permissions du Membre Actif
const List<String> _activeMemberPermissions = [
  // Dashboard personnel
  PermissionMatrix.DASHBOARD_VIEW,
  
  // Profil personnel
  PermissionMatrix.MEMBERS_VIEW_OWN,
  PermissionMatrix.MEMBERS_EDIT_OWN,
  
  // Finances personnelles
  PermissionMatrix.FINANCES_VIEW_OWN,
  
  // Événements
  PermissionMatrix.EVENTS_VIEW_ALL,
  PermissionMatrix.EVENTS_CREATE,
  PermissionMatrix.EVENTS_EDIT_OWN,
  
  // Solidarité
  PermissionMatrix.SOLIDARITY_VIEW_ALL,
  PermissionMatrix.SOLIDARITY_CREATE,
];

/// Permissions du Membre Simple
const List<String> _simpleMemberPermissions = [
  // Dashboard basique
  PermissionMatrix.DASHBOARD_VIEW,
  
  // Profil personnel uniquement
  PermissionMatrix.MEMBERS_VIEW_OWN,
  PermissionMatrix.MEMBERS_EDIT_OWN,
  
  // Finances personnelles
  PermissionMatrix.FINANCES_VIEW_OWN,
  
  // Événements publics
  PermissionMatrix.EVENTS_VIEW_PUBLIC,
  
  // Solidarité consultation
  PermissionMatrix.SOLIDARITY_VIEW_OWN,
];

/// Permissions du Visiteur
const List<String> _visitorPermissions = [
  // Événements publics uniquement
  PermissionMatrix.EVENTS_VIEW_PUBLIC,
];
