import 'package:flutter/material.dart';

/// Widget d'overlay de chargement qui affiche un spinner centré avec un message optionnel
/// Utilisé pour les opérations longues comme la connexion, déconnexion et synchronisation
class LoadingOverlay extends StatelessWidget {
  final String? message;
  final Color backgroundColor;
  final Color spinnerColor;
  final Color textColor;
  final double spinnerSize;
  final double strokeWidth;

  const LoadingOverlay({
    super.key,
    this.message,
    this.backgroundColor = Colors.black54,
    this.spinnerColor = Colors.white,
    this.textColor = Colors.white,
    this.spinnerSize = 60.0,
    this.strokeWidth = 5.0,
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      color: backgroundColor,
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            SizedBox(
              width: spinnerSize,
              height: spinnerSize,
              child: CircularProgressIndicator(
                valueColor: AlwaysStoppedAnimation<Color>(spinnerColor),
                strokeWidth: strokeWidth,
              ),
            ),
            if (message != null) ...[
              // Afficher le texte seulement si message n'est pas null
              const SizedBox(height: 24),
              Text(
                message!,
                style: TextStyle(
                  fontSize: 16,
                  fontWeight: FontWeight.bold,
                  color: textColor,
                ),
                textAlign: TextAlign.center,
              ),
            ],
          ],
        ),
      ),
    );
  }

  /// Méthode statique pour afficher l'overlay de chargement
  static Future<T> show<T>({
    required BuildContext context,
    required Future<T> future,
    String? message,
    double spinnerSize = 60.0,
    double strokeWidth = 5.0,
  }) async {
    // Afficher l'overlay
    final overlayEntry = OverlayEntry(
      builder: (context) => LoadingOverlay(
        message: message,
        spinnerSize: spinnerSize,
        strokeWidth: strokeWidth,
      ),
    );

    Overlay.of(context).insert(overlayEntry);

    try {
      // Attendre que le future se termine
      final result = await future;
      // Supprimer l'overlay
      overlayEntry.remove();
      return result;
    } catch (e) {
      // En cas d'erreur, supprimer l'overlay et relancer l'erreur
      overlayEntry.remove();
      rethrow;
    }
  }
}
