import 'package:flutter/material.dart'; import '../models/movie.dart'; import '../services/database_service.dart'; import 'movie_detail_page.dart'; class FavoritesPage extends StatefulWidget { const FavoritesPage({super.key}); @override State createState() => _FavoritesPageState(); } class _FavoritesPageState extends State { List favoriteMovies = []; bool isLoading = true; String? errorMessage; @override void initState() { super.initState(); _loadFavorites(); } Future _loadFavorites() async { try { setState(() { isLoading = true; errorMessage = null; }); final favorites = await DatabaseService.getFavorites(); setState(() { favoriteMovies = favorites; isLoading = false; }); } catch (e) { setState(() { errorMessage = e.toString(); isLoading = false; }); } } Future _removeFavorite(Movie movie) async { final success = await DatabaseService.removeFromFavorites(movie.id); if (success) { setState(() { favoriteMovies.removeWhere((m) => m.id == movie.id); }); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('${movie.title} supprimé des favoris'), backgroundColor: Colors.red, ), ); } } void _navigateToMovieDetail(Movie movie) { Navigator.push( context, MaterialPageRoute( builder: (context) => MovieDetailPage(movie: movie), ), ); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( backgroundColor: Colors.purple, centerTitle: true, title: const Text( "MES FAVORIS", style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: Colors.white, ), ), ), body: _buildBody(), ); } Widget _buildBody() { if (isLoading) { return const Center( child: CircularProgressIndicator( color: Colors.purple, ), ); } if (errorMessage != null) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon( Icons.error_outline, color: Colors.red, size: 64, ), const SizedBox(height: 16), Text( 'Erreur de chargement', style: const TextStyle( color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( errorMessage!, style: TextStyle( color: Colors.grey[400], fontSize: 14, ), textAlign: TextAlign.center, ), const SizedBox(height: 16), ElevatedButton( onPressed: _loadFavorites, style: ElevatedButton.styleFrom( backgroundColor: Colors.purple, foregroundColor: Colors.white, ), child: const Text('Réessayer'), ), ], ), ); } if (favoriteMovies.isEmpty) { return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon( Icons.favorite_border, color: Colors.grey, size: 100, ), const SizedBox(height: 16), const Text( 'Aucun favori', style: TextStyle( color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( 'Ajoutez des films à vos favoris\nen cliquant sur le cœur', style: TextStyle( color: Colors.grey[400], fontSize: 16, ), textAlign: TextAlign.center, ), ], ), ); } return ListView.builder( padding: const EdgeInsets.all(16), itemCount: favoriteMovies.length, itemBuilder: (context, index) { final movie = favoriteMovies[index]; return _buildFavoriteItem(movie); }, ); } Widget _buildFavoriteItem(Movie movie) { return Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.grey[900], borderRadius: BorderRadius.circular(12), border: Border.all(color: Colors.grey[800]!, width: 1), ), child: Row( children: [ GestureDetector( onTap: () => _navigateToMovieDetail(movie), child: Container( width: 80, height: 80, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: Colors.grey[700], ), child: movie.imageUrl.isNotEmpty ? Image.network( movie.imageUrl, width: 80, height: 80, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), gradient: LinearGradient( colors: [Colors.grey[600]!, Colors.grey[800]!], ), ), child: const Center( child: Icon( Icons.movie, color: Colors.white, size: 30, ), ), ); }, ) : Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), gradient: LinearGradient( colors: [Colors.grey[600]!, Colors.grey[800]!], ), ), child: const Center( child: Icon( Icons.movie, color: Colors.white, size: 30, ), ), ), ), ), const SizedBox(width: 16), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( movie.title, style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), Row( children: [ const Icon(Icons.star, color: Colors.amber, size: 14), const SizedBox(width: 4), Text( movie.rating.toStringAsFixed(1), style: TextStyle( color: Colors.amber, fontSize: 12, fontWeight: FontWeight.w500, ), ), const SizedBox(width: 8), Text( movie.category, style: TextStyle( color: Colors.purple[300], fontSize: 12, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 4), Text( movie.description, style: TextStyle( color: Colors.grey[400], fontSize: 12, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 4), Text( movie.releaseDate, style: TextStyle( color: Colors.grey[500], fontSize: 10, ), ), ], ), ), Column( children: [ IconButton( onPressed: () => _removeFavorite(movie), icon: const Icon( Icons.favorite, color: Colors.red, size: 24, ), ), IconButton( onPressed: () => _navigateToMovieDetail(movie), icon: const Icon( Icons.play_arrow, color: Colors.red, size: 24, ), ), ], ), ], ), ); } }