import 'package:em2rp/providers/local_user_provider.dart';
import 'package:em2rp/views/login_page.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:em2rp/views/widgets/common/startup_splash_screen.dart';

class AuthGuard extends StatelessWidget {
  final Widget child;
  final String? requiredPermission;
  final bool allowWhileLoading;

  const AuthGuard({
    super.key,
    required this.child,
    this.requiredPermission,
    this.allowWhileLoading = false,
  });

  @override
  Widget build(BuildContext context) {
    final localAuthProvider = Provider.of<LocalUserProvider>(context);
    final firebaseUser = FirebaseAuth.instance.currentUser;

    // Log pour débug
    print('[AuthGuard] Vérification accès - User: ${localAuthProvider.currentUser?.uid}, Permission requise: $requiredPermission');

    // Si Firebase n'a pas encore restauré la session ou si le profil charge,
    // afficher un écran neutre plutôt que la page de connexion.
    if (firebaseUser != null &&
        (localAuthProvider.currentUser == null ||
            localAuthProvider.isLoadingUserData)) {
      if (allowWhileLoading) {
        return child;
      }

      return const StartupSplashScreen(message: 'Chargement du profil...');
    }

    // Si l'utilisateur n'est pas connecté
    if (firebaseUser == null || localAuthProvider.currentUser == null) {
      print('[AuthGuard] Utilisateur non connecté, redirection vers LoginPage');
      return const LoginPage();
    }

    // Si la page requiert une permission spécifique et que l'utilisateur ne la possède pas
    if (requiredPermission != null &&
        !localAuthProvider.hasPermission(requiredPermission!)) {
      print('[AuthGuard] Permission "$requiredPermission" refusée');
      return Scaffold(
        appBar: AppBar(title: const Text("Accès refusé")),
        body: const Center(
          child: Text("Vous n'êtes pas autorisé à accéder à cette page."),
        ),
      );
    }

    // Sinon, afficher la page demandée
    print('[AuthGuard] Accès autorisé, affichage de la page');
    return child;
  }
}
