/// Widget d'erreur réutilisable pour toute l'application
library error_widget;

import 'package:flutter/material.dart';

/// Widget d'erreur avec message et bouton de retry
class AppErrorWidget extends StatelessWidget {
  /// Message d'erreur à afficher
  final String message;
  
  /// Callback appelé lors du clic sur le bouton retry
  final VoidCallback? onRetry;
  
  /// Icône personnalisée (optionnel)
  final IconData? icon;
  
  /// Titre personnalisé (optionnel)
  final String? title;

  const AppErrorWidget({
    super.key,
    required this.message,
    this.onRetry,
    this.icon,
    this.title,
  });

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Padding(
        padding: const EdgeInsets.all(12.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: [
            Icon(
              icon ?? Icons.error_outline,
              size: 40,
              color: Theme.of(context).colorScheme.error,
            ),
            const SizedBox(height: 8),
            Text(
              title ?? 'Oups !',
              style: Theme.of(context).textTheme.headlineSmall?.copyWith(
                color: Theme.of(context).colorScheme.onSurface,
                fontWeight: FontWeight.bold,
              ),
            ),
            const SizedBox(height: 8),
            Text(
              message,
              textAlign: TextAlign.center,
              style: Theme.of(context).textTheme.bodyMedium?.copyWith(
                color: Theme.of(context).colorScheme.onSurfaceVariant,
              ),
            ),
            if (onRetry != null) ...[
              const SizedBox(height: 12),
              ElevatedButton.icon(
                onPressed: onRetry,
                icon: const Icon(Icons.refresh),
                label: const Text('Réessayer'),
                style: ElevatedButton.styleFrom(
                  padding: const EdgeInsets.symmetric(
                    horizontal: 24,
                    vertical: 10,
                  ),
                ),
              ),
            ],
          ],
        ),
      ),
    );
  }
}

/// Widget d'erreur réseau spécifique
class NetworkErrorWidget extends StatelessWidget {
  final VoidCallback? onRetry;

  const NetworkErrorWidget({
    super.key,
    this.onRetry,
  });

  @override
  Widget build(BuildContext context) {
    return AppErrorWidget(
      message: 'Impossible de se connecter au serveur.\nVérifiez votre connexion internet.',
      onRetry: onRetry,
      icon: Icons.wifi_off,
      title: 'Pas de connexion',
    );
  }
}

/// Widget d'erreur de permissions
class PermissionErrorWidget extends StatelessWidget {
  final String? message;

  const PermissionErrorWidget({
    super.key,
    this.message,
  });

  @override
  Widget build(BuildContext context) {
    return AppErrorWidget(
      message: message ?? 'Vous n\'avez pas les permissions nécessaires pour accéder à cette ressource.',
      icon: Icons.lock_outline,
      title: 'Accès refusé',
    );
  }
}

/// Widget d'erreur "Aucune donnée"
class EmptyDataWidget extends StatelessWidget {
  final String message;
  final IconData? icon;
  final VoidCallback? onAction;
  final String? actionLabel;

  const EmptyDataWidget({
    super.key,
    required this.message,
    this.icon,
    this.onAction,
    this.actionLabel,
  });

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Padding(
        padding: const EdgeInsets.all(12.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: [
            Icon(
              icon ?? Icons.inbox_outlined,
              size: 40,
              color: Theme.of(context).colorScheme.onSurfaceVariant,
            ),
            const SizedBox(height: 8),
            Text(
              message,
              textAlign: TextAlign.center,
              style: Theme.of(context).textTheme.bodyLarge?.copyWith(
                color: Theme.of(context).colorScheme.onSurfaceVariant,
              ),
            ),
            if (onAction != null && actionLabel != null) ...[
              const SizedBox(height: 12),
              ElevatedButton(
                onPressed: onAction,
                child: Text(actionLabel!),
              ),
            ],
          ],
        ),
      ),
    );
  }
}

