import 'package:flutter/material.dart';
import 'package:geosector_app/presentation/widgets/dashboard_layout.dart';
import 'package:geosector_app/presentation/widgets/backgrounds/gradient_background.dart';
import 'package:geosector_app/core/config/navigation_config.dart';
import 'package:geosector_app/core/services/current_user_service.dart';
import 'package:geosector_app/app.dart';

/// Scaffold unifié pour toutes les pages (admin et user)
/// Adapte automatiquement son apparence selon le rôle de l'utilisateur
class AppScaffold extends StatelessWidget {
  /// Le contenu de la page
  final Widget body;

  /// L'index de navigation sélectionné
  final int selectedIndex;

  /// Le titre de la page
  final String pageTitle;

  /// Callback optionnel pour gérer la navigation personnalisée
  final Function(int)? onDestinationSelected;

  /// Forcer le mode admin (optionnel, sinon détecte automatiquement)
  final bool? forceAdmin;

  /// Afficher ou non le fond dégradé avec points (économise des ressources si désactivé)
  final bool showBackground;

  const AppScaffold({
    super.key,
    required this.body,
    required this.selectedIndex,
    required this.pageTitle,
    this.onDestinationSelected,
    this.forceAdmin,
    this.showBackground = true,
  });

  @override
  Widget build(BuildContext context) {
    final currentUser = userRepository.getCurrentUser();
    final size = MediaQuery.of(context).size;
    final isMobile = size.width <= 900;

    // Déterminer si l'utilisateur est admin (prend en compte le mode d'affichage)
    final userRole = currentUser?.role ?? 1;
    final isAdmin = forceAdmin ?? CurrentUserService.instance.shouldShowAdminUI;

    debugPrint('🎨 AppScaffold: isAdmin=$isAdmin, displayMode=${CurrentUserService.instance.displayMode}, userRole=$userRole');

    // Pour les utilisateurs standards, vérifier les conditions d'accès
    if (!isAdmin) {
      final hasOperation = userRepository.getCurrentOperation() != null;
      final hasSectors = userRepository.getUserSectors().isNotEmpty;

      // Si pas d'opération, afficher le message approprié
      if (!hasOperation) {
        return _buildRestrictedAccess(
          context: context,
          icon: Icons.warning_outlined,
          title: 'Aucune opération assignée',
          message: 'Vous n\'avez pas encore été affecté à une opération. '
              'Veuillez contacter votre administrateur pour obtenir un accès.',
          isAdmin: false,
        );
      }

      // Si pas de secteur, afficher le message approprié
      if (!hasSectors) {
        return _buildRestrictedAccess(
          context: context,
          icon: Icons.map_outlined,
          title: 'Aucun secteur assigné',
          message: 'Vous n\'êtes affecté sur aucun secteur. '
              'Contactez votre administrateur pour qu\'il vous en affecte au moins un.',
          isAdmin: false,
        );
      }
    }

    return Stack(
      children: [
        // Fond dégradé avec petits points blancs (optionnel)
        if (showBackground)
          GradientBackground(
            isAdmin: isAdmin,
            showDots: true,
          ),

        // Contenu de la page avec navigation
        DashboardLayout(
          key: ValueKey(
              'dashboard_layout_${isAdmin ? 'admin' : 'user'}_$selectedIndex'),
          title: NavigationConfig.getDashboardTitle(isAdmin),
          selectedIndex: selectedIndex,
          onDestinationSelected: onDestinationSelected ??
              (index) {
                NavigationConfig.navigateToIndex(context, index, isAdmin);
              },
          destinations: NavigationConfig.getDestinations(
            isAdmin: isAdmin,
            isMobile: isMobile,
          ),
          isAdmin: isAdmin,
          body: body,
        ),
      ],
    );
  }

  /// Construit l'écran d'accès restreint
  Widget _buildRestrictedAccess({
    required BuildContext context,
    required IconData icon,
    required String title,
    required String message,
    required bool isAdmin,
  }) {
    final theme = Theme.of(context);

    return Stack(
      children: [
        // Fond dégradé (optionnel)
        if (showBackground)
          GradientBackground(
            isAdmin: isAdmin,
            showDots: true,
          ),

        // Message d'accès restreint
        DashboardLayout(
          title: 'GEOSECTOR',
          selectedIndex: 0,
          onDestinationSelected: (index) {
            // Ne rien faire car l'utilisateur ne peut pas naviguer
          },
          destinations: const [
            NavigationDestination(
              icon: Icon(Icons.warning_outlined),
              selectedIcon: Icon(Icons.warning),
              label: 'Accès restreint',
            ),
          ],
          isAdmin: false,
          body: Center(
            child: Container(
              padding: const EdgeInsets.all(24),
              constraints: const BoxConstraints(maxWidth: 500),
              decoration: BoxDecoration(
                color: theme.colorScheme.surface,
                borderRadius: BorderRadius.circular(16),
                boxShadow: [
                  BoxShadow(
                    color: theme.shadowColor.withOpacity(0.1),
                    blurRadius: 10,
                    offset: const Offset(0, 4),
                  ),
                ],
              ),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  Icon(
                    icon,
                    size: 80,
                    color: theme.colorScheme.error,
                  ),
                  const SizedBox(height: 24),
                  Text(
                    title,
                    style: theme.textTheme.headlineSmall?.copyWith(
                      fontWeight: FontWeight.bold,
                      color: theme.colorScheme.primary,
                    ),
                    textAlign: TextAlign.center,
                  ),
                  const SizedBox(height: 16),
                  Text(
                    message,
                    style: theme.textTheme.bodyLarge?.copyWith(
                      color: theme.colorScheme.onSurface.withOpacity(0.7),
                    ),
                    textAlign: TextAlign.center,
                  ),
                ],
              ),
            ),
          ),
        ),
      ],
    );
  }
}