import 'package:flutter/material.dart';

/// A reusable error display component.
///
/// This widget provides a consistent way to display error messages throughout
/// the application. It supports customizable titles, messages, icons, and
/// action buttons for retry and close operations.
class ErrorContent extends StatelessWidget {
  /// The error title to display
  final String title;

  /// The error message to display
  final String message;

  /// Optional callback for retry action
  final VoidCallback? onRetry;

  /// Optional callback for close action
  final VoidCallback? onClose;

  /// Icon to display with the error
  final IconData icon;

  /// Color of the error icon
  final Color? iconColor;

  /// Creates a new [ErrorContent] widget.
  ///
  /// [message] is required, other parameters are optional with sensible defaults.
  const ErrorContent({
    super.key,
    this.title = 'An error occurred',
    required this.message,
    this.onRetry,
    this.onClose,
    this.icon = Icons.error_outline,
    this.iconColor,
  });

  @override
  Widget build(BuildContext context) {
    final isDarkMode = Theme.of(context).brightness == Brightness.dark;
    final defaultIconColor = iconColor ?? Colors.red[400];

    return Container(
      padding: const EdgeInsets.all(24),
      decoration: BoxDecoration(
        color: isDarkMode ? Colors.grey[900] : Colors.white,
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withValues(alpha: 0.1),
            blurRadius: 10,
            spreadRadius: 2,
          ),
        ],
      ),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          // Bouton fermer en haut à droite
          if (onClose != null)
            Align(
              alignment: Alignment.topRight,
              child: IconButton(
                icon: const Icon(Icons.close),
                onPressed: onClose,
                padding: EdgeInsets.zero,
                constraints: const BoxConstraints(),
              ),
            ),

          const SizedBox(height: 8),

          // Icône d'erreur
          Container(
            padding: const EdgeInsets.all(16),
            decoration: BoxDecoration(
              color: defaultIconColor?.withValues(alpha: 0.1),
              shape: BoxShape.circle,
            ),
            child: Icon(icon, size: 48, color: defaultIconColor),
          ),

          const SizedBox(height: 24),

          // Titre
          Text(
            title,
            style: TextStyle(
              fontSize: 20,
              fontWeight: FontWeight.bold,
              color: isDarkMode ? Colors.white : Colors.black87,
            ),
            textAlign: TextAlign.center,
          ),

          const SizedBox(height: 12),

          // Message d'erreur
          Text(
            message,
            style: TextStyle(
              fontSize: 14,
              color: Colors.grey[600],
              height: 1.5,
            ),
            textAlign: TextAlign.center,
          ),

          const SizedBox(height: 24),

          // Boutons d'action
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              if (onRetry != null) ...[
                ElevatedButton.icon(
                  onPressed: onRetry,
                  icon: const Icon(Icons.refresh),
                  label: const Text('Réessayer'),
                  style: ElevatedButton.styleFrom(
                    padding: const EdgeInsets.symmetric(
                      horizontal: 24,
                      vertical: 12,
                    ),
                  ),
                ),
                if (onClose != null) const SizedBox(width: 12),
              ],
              if (onClose != null)
                OutlinedButton.icon(
                  onPressed: onClose,
                  icon: const Icon(Icons.close),
                  label: const Text('Fermer'),
                  style: OutlinedButton.styleFrom(
                    padding: const EdgeInsets.symmetric(
                      horizontal: 24,
                      vertical: 12,
                    ),
                  ),
                ),
            ],
          ),
        ],
      ),
    );
  }
}

// Fonction helper pour afficher l'erreur en dialog
void showErrorDialog(
  BuildContext context, {
  String title = 'Une erreur est survenue',
  required String message,
  VoidCallback? onRetry,
  IconData icon = Icons.error_outline,
  Color? iconColor,
  bool barrierDismissible = true,
}) {
  showDialog(
    context: context,
    barrierDismissible: barrierDismissible,
    builder: (BuildContext dialogContext) {
      return Dialog(
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
        child: ErrorContent(
          title: title,
          message: message,
          icon: icon,
          iconColor: iconColor,
          onRetry: onRetry != null
              ? () {
                  Navigator.of(dialogContext).pop();
                  onRetry();
                }
              : null,
          onClose: () => Navigator.of(dialogContext).pop(),
        ),
      );
    },
  );
}
