import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/config/app_constants.dart'; import '../../l10n/app_localizations.dart'; import '../providers/repository_provider.dart'; import '../providers/theme_provider.dart'; import '../widgets/game_over/game_over_header.dart'; import '../widgets/game_over/game_over_stats.dart'; import '../widgets/game_over/game_over_actions.dart'; import '../widgets/game_over/hinge_divider.dart'; /// Écran de fin de partie. Affiche le Pokémon manqué, les stats, et propose de rejouer. class GameOverPage extends ConsumerStatefulWidget { const GameOverPage({Key? key}) : super(key: key); @override ConsumerState createState() => _GameOverPageState(); } class _GameOverPageState extends ConsumerState { int _seenCount = 0; bool _isLoading = true; @override void initState() { super.initState(); _loadSeenCount(); } Future _loadSeenCount() async { final count = await ref.read(pokemonRepositoryProvider).seenCount(); if (mounted) { setState(() { _seenCount = count; _isLoading = false; }); } } @override Widget build(BuildContext context) { final args = ModalRoute.of(context)!.settings.arguments as Map?; final pokemonImage = args?['pokemonImage'] ?? ''; final pokemonName = args?['pokemonName'] ?? 'Unknown'; final int streak = args?['streak'] ?? 0; final int score = args?['score'] ?? 0; final palette = appPalettes[ref.watch(themeProvider)]; final primaryDark = HSLColor.fromColor(palette.primary) .withLightness((HSLColor.fromColor(palette.primary).lightness - 0.12).clamp(0.0, 1.0)) .toColor(); const silverBg = Color(0xFFC8D1D8); return Scaffold( backgroundColor: palette.primary, body: _isLoading ? const Center(child: CircularProgressIndicator(color: Colors.white)) : SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ GameOverHeader( pokemonImage: pokemonImage, pokemonName: pokemonName, primaryDark: primaryDark, surfaceColor: palette.surface, ), HingeDivider(color: primaryDark), Container( decoration: BoxDecoration(color: primaryDark, border: Border.all(color: primaryDark, width: 4)), child: Container( width: double.infinity, padding: const EdgeInsets.all(16), color: silverBg, child: Column( children: [ Container( width: double.infinity, color: palette.surface, padding: const EdgeInsets.all(24), child: Text( AppLocalizations.of(context)!.gameOverMessage, textAlign: TextAlign.center, style: const TextStyle(color: Colors.white, fontSize: 18, height: 1.5), ), ), const SizedBox(height: 16), GameOverStats( streak: streak.toString().padLeft(3, '0'), seen: "$_seenCount/${AppConstants.totalPokemon}", score: "$score", ), const SizedBox(height: 16), GameOverActions( primaryColor: palette.primary, primaryDark: primaryDark, onTryAgain: () => Navigator.pop(context, true), onBack: () => Navigator.pop(context, false), ), ], ), ), ), ], ), ), ), ); } }