/// Énumération centralisée de toutes les permissions de l'application
/// Chaque permission contrôle l'accès à une fonctionnalité spécifique
enum AppPermission {
  // ============= ÉVÉNEMENTS =============
  /// Permet de voir les événements
  viewEvents('view_events'),

  /// Permet de créer de nouveaux événements
  createEvents('create_events'),

  /// Permet de modifier les événements existants
  editEvents('edit_events'),

  /// Permet de supprimer des événements
  deleteEvents('delete_events'),

  /// Permet de voir tous les événements de tous les utilisateurs
  /// (nécessaire pour le filtre par utilisateur dans le calendrier)
  viewAllUserEvents('view_all_user_events'),

  // ============= ÉQUIPEMENTS =============
  /// Permet de voir la liste des équipements
  viewEquipment('view_equipment'),

  /// Permet de créer, modifier et supprimer des équipements
  /// Inclut aussi la gestion des prix d'achat/location
  manageEquipment('manage_equipment'),

  // ============= CONTENEURS =============
  /// Permet de voir les conteneurs
  viewContainers('view_containers'),

  /// Permet de créer, modifier et supprimer des conteneurs
  manageContainers('manage_containers'),

  // ============= MAINTENANCE =============
  /// Permet de voir les maintenances
  viewMaintenance('view_maintenances'),

  /// Permet de créer, modifier et supprimer des maintenances
  manageMaintenance('manage_maintenances'),

  // ============= UTILISATEURS =============
  /// Permet de voir la liste de tous les utilisateurs
  viewAllUsers('view_all_users'),

  /// Permet de créer, modifier et supprimer des utilisateurs
  /// Inclut la gestion des rôles
  manageUsers('manage_users'),

  // ============= ALERTES =============
  /// Reçoit les alertes de maintenance
  receiveMaintenanceAlerts('receive_maintenance_alerts'),

  /// Reçoit les alertes d'événements (création, modification)
  receiveEventAlerts('receive_event_alerts'),

  /// Reçoit les alertes de stock faible
  receiveStockAlerts('receive_stock_alerts'),

  // ============= NOTIFICATIONS =============
  /// Peut recevoir des notifications par email
  receiveEmailNotifications('receive_email_notifications'),

  /// Peut recevoir des notifications push dans le navigateur
  receivePushNotifications('receive_push_notifications'),

  // ============= PRÉPARATION/CHARGEMENT =============
  /// Permet d'accéder aux pages de préparation d'événements
  accessPreparation('access_preparation'),

  /// Permet de valider les étapes de préparation
  validatePreparation('validate_preparation'),

  // ============= EXPORTS/RAPPORTS =============
  /// Permet d'exporter des données (ICS, PDF, etc.)
  exportData('export_data'),

  /// Permet de générer des rapports
  generateReports('generate_reports');

  /// L'identifiant de la permission tel qu'il est stocké dans Firestore
  final String id;

  const AppPermission(this.id);

  /// Convertit une string en AppPermission
  static AppPermission? fromString(String? value) {
    if (value == null) return null;
    try {
      return AppPermission.values.firstWhere((p) => p.id == value);
    } catch (e) {
      return null;
    }
  }

  /// Retourne une description lisible de la permission (pour l'UI admin)
  String get description {
    switch (this) {
      // Événements
      case AppPermission.viewEvents:
        return 'Voir les événements';
      case AppPermission.createEvents:
        return 'Créer des événements';
      case AppPermission.editEvents:
        return 'Modifier des événements';
      case AppPermission.deleteEvents:
        return 'Supprimer des événements';
      case AppPermission.viewAllUserEvents:
        return 'Voir les événements de tous les utilisateurs';

      // Équipements
      case AppPermission.viewEquipment:
        return 'Voir les équipements';
      case AppPermission.manageEquipment:
        return 'Gérer les équipements';

      // Conteneurs
      case AppPermission.viewContainers:
        return 'Voir les conteneurs';
      case AppPermission.manageContainers:
        return 'Gérer les conteneurs';

      // Maintenance
      case AppPermission.viewMaintenance:
        return 'Voir les maintenances';
      case AppPermission.manageMaintenance:
        return 'Gérer les maintenances';

      // Utilisateurs
      case AppPermission.viewAllUsers:
        return 'Voir tous les utilisateurs';
      case AppPermission.manageUsers:
        return 'Gérer les utilisateurs';

      // Alertes
      case AppPermission.receiveMaintenanceAlerts:
        return 'Recevoir les alertes de maintenance';
      case AppPermission.receiveEventAlerts:
        return 'Recevoir les alertes d\'événements';
      case AppPermission.receiveStockAlerts:
        return 'Recevoir les alertes de stock';

      // Notifications
      case AppPermission.receiveEmailNotifications:
        return 'Recevoir les notifications par email';
      case AppPermission.receivePushNotifications:
        return 'Recevoir les notifications push';

      // Préparation
      case AppPermission.accessPreparation:
        return 'Accéder aux préparations d\'événements';
      case AppPermission.validatePreparation:
        return 'Valider les préparations';

      // Exports
      case AppPermission.exportData:
        return 'Exporter des données';
      case AppPermission.generateReports:
        return 'Générer des rapports';
    }
  }

  /// Retourne la catégorie de la permission (pour l'UI de gestion des rôles)
  String get category {
    switch (this) {
      case AppPermission.viewEvents:
      case AppPermission.createEvents:
      case AppPermission.editEvents:
      case AppPermission.deleteEvents:
      case AppPermission.viewAllUserEvents:
        return 'Événements';

      case AppPermission.viewEquipment:
      case AppPermission.manageEquipment:
        return 'Équipements';

      case AppPermission.viewContainers:
      case AppPermission.manageContainers:
        return 'Conteneurs';

      case AppPermission.viewMaintenance:
      case AppPermission.manageMaintenance:
        return 'Maintenance';

      case AppPermission.viewAllUsers:
      case AppPermission.manageUsers:
        return 'Utilisateurs';

      case AppPermission.receiveMaintenanceAlerts:
      case AppPermission.receiveEventAlerts:
      case AppPermission.receiveStockAlerts:
        return 'Alertes';

      case AppPermission.receiveEmailNotifications:
      case AppPermission.receivePushNotifications:
        return 'Notifications';

      case AppPermission.accessPreparation:
      case AppPermission.validatePreparation:
        return 'Préparation';

      case AppPermission.exportData:
      case AppPermission.generateReports:
        return 'Exports & Rapports';
    }
  }
}

/// Extension pour faciliter les vérifications de permissions
extension PermissionListExtension on List<String> {
  /// Vérifie si la liste contient une permission donnée
  bool hasPermission(AppPermission permission) {
    return contains(permission.id);
  }

  /// Vérifie si la liste contient toutes les permissions données
  bool hasAllPermissions(List<AppPermission> permissions) {
    return permissions.every((p) => contains(p.id));
  }

  /// Vérifie si la liste contient au moins une des permissions données
  bool hasAnyPermission(List<AppPermission> permissions) {
    return permissions.any((p) => contains(p.id));
  }
}

/// Rôles prédéfinis avec leurs permissions
class PredefinedRoles {
  /// Rôle ADMIN : Accès complet à toutes les fonctionnalités
  static List<String> get admin => AppPermission.values.map((p) => p.id).toList();

  /// Rôle TECHNICIEN : Gestion des équipements et préparation
  static List<String> get technician => [
    AppPermission.viewEvents.id,
    AppPermission.viewEquipment.id,
    AppPermission.manageEquipment.id,
    AppPermission.viewContainers.id,
    AppPermission.manageContainers.id,
    AppPermission.viewMaintenance.id,
    AppPermission.manageMaintenance.id,
    AppPermission.receiveMaintenanceAlerts.id,
    AppPermission.receiveStockAlerts.id,
    AppPermission.accessPreparation.id,
    AppPermission.validatePreparation.id,
    AppPermission.exportData.id,
  ];

  /// Rôle MANAGER : Gestion des événements et vue d'ensemble
  static List<String> get manager => [
    AppPermission.viewEvents.id,
    AppPermission.createEvents.id,
    AppPermission.editEvents.id,
    AppPermission.deleteEvents.id,
    AppPermission.viewAllUserEvents.id,
    AppPermission.viewEquipment.id,
    AppPermission.viewContainers.id,
    AppPermission.viewMaintenance.id,
    AppPermission.viewAllUsers.id,
    AppPermission.receiveEventAlerts.id,
    AppPermission.accessPreparation.id,
    AppPermission.exportData.id,
    AppPermission.generateReports.id,
  ];

  /// Rôle USER : Consultation uniquement
  static List<String> get user => [
    AppPermission.viewEvents.id,
    AppPermission.viewEquipment.id,
    AppPermission.viewContainers.id,
    AppPermission.receiveEventAlerts.id,
  ];
}

