import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../data/providers/friends_provider.dart';
import '../../widgets/friend_detail_screen.dart';
import '../../widgets/friends_circle.dart';
import '../../widgets/search_friends.dart';

/// [FriendsScreen] est l'écran principal permettant d'afficher et de gérer la liste des amis.
/// Il inclut des fonctionnalités de pagination, de recherche, et de rafraîchissement manuel de la liste.
class FriendsScreen extends StatefulWidget {
  final String userId; // Identifiant de l'utilisateur pour récupérer ses amis

  const FriendsScreen({Key? key, required this.userId}) : super(key: key);

  @override
  _FriendsScreenState createState() => _FriendsScreenState();
}

class _FriendsScreenState extends State<FriendsScreen> {
  late ScrollController _scrollController;

  @override
  void initState() {
    super.initState();
    // Initialisation du contrôleur de défilement pour la gestion de la pagination.
    _scrollController = ScrollController();
    _scrollController.addListener(_onScroll);

    // Log pour indiquer le début du chargement des amis
    debugPrint("[LOG] Initialisation de la page : chargement des amis pour l'utilisateur ${widget.userId}");
    // Chargement initial de la liste d'amis
    Provider.of<FriendsProvider>(context, listen: false).fetchFriends(widget.userId);
  }

  @override
  void dispose() {
    // Nettoyage du contrôleur de défilement pour éviter les fuites de mémoire.
    _scrollController.removeListener(_onScroll);
    _scrollController.dispose();
    super.dispose();
    debugPrint("[LOG] Dispose : contrôleur de défilement supprimé");
  }

  /// Méthode déclenchée lors du défilement de la liste.
  /// Vérifie si l'utilisateur a atteint le bas de la liste pour charger plus d'amis.
  void _onScroll() {
    final provider = Provider.of<FriendsProvider>(context, listen: false);
    if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent &&
        !provider.isLoading && provider.hasMore) {
      debugPrint("[LOG] Scroll : fin de liste atteinte, chargement de la page suivante");
      // Charger plus d'amis si on atteint la fin de la liste
      provider.fetchFriends(widget.userId);
    }
  }

  @override
  Widget build(BuildContext context) {
    // Accès au fournisseur pour gérer les données et les états des amis.
    final friendsProvider = Provider.of<FriendsProvider>(context, listen: false);

    return Scaffold(
      appBar: AppBar(
        title: const Text('Mes Amis'),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () {
              // Log de l'action de rafraîchissement
              debugPrint("[LOG] Bouton Refresh : demande de rafraîchissement de la liste des amis");
              // Rafraîchir la liste des amis
              friendsProvider.fetchFriends(widget.userId);
            },
          ),
        ],
      ),
      body: SafeArea(
        child: Column(
          children: [
            const Padding(
              padding: EdgeInsets.all(8.0),
              // Widget pour la recherche d'amis
              child: SearchFriends(),
            ),
            Expanded(
              // Construction de la liste d'amis basée sur l'état du FriendsProvider
              child: Consumer<FriendsProvider>(
                builder: (context, friendsProvider, child) {
                  // Si le chargement est en cours et qu'il n'y a aucun ami, afficher un indicateur de chargement.
                  if (friendsProvider.isLoading && friendsProvider.friendsList.isEmpty) {
                    debugPrint("[LOG] Chargement : affichage de l'indicateur de progression");
                    return const Center(child: CircularProgressIndicator());
                  }

                  // Si la liste est vide après le chargement, afficher un message indiquant qu'aucun ami n'a été trouvé.
                  if (friendsProvider.friendsList.isEmpty) {
                    debugPrint("[LOG] Liste vide : Aucun ami trouvé");
                    return const Center(
                      child: Text('Aucun ami trouvé'),
                    );
                  }

                  // Affichage de la grille des amis
                  debugPrint("[LOG] Affichage de la grille des amis (nombre d'amis : ${friendsProvider.friendsList.length})");

                  return GridView.builder(
                    controller: _scrollController,
                    padding: const EdgeInsets.all(16),
                    gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                      crossAxisCount: 3,
                      mainAxisSpacing: 10,
                      crossAxisSpacing: 10,
                    ),
                    itemCount: friendsProvider.friendsList.length,
                    itemBuilder: (context, index) {
                      final friend = friendsProvider.friendsList[index];
                      debugPrint("[LOG] Affichage de l'ami à l'index $index avec ID : ${friend.friendId}");

                      return FriendsCircle(
                        friend: friend,
                        onTap: () {
                          // Log pour l'action de visualisation des détails d'un ami
                          debugPrint("[LOG] Détail : Affichage des détails de l'ami ID : ${friend.friendId}");
                          // Naviguer vers l'écran des détails de l'ami
                          FriendDetailScreen.open(
                            context,
                            friend.friendId,
                            friend.firstName ?? 'Ami inconnu',
                            friend.imageUrl ?? '',
                          );
                        },
                      );
                    },
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}
