import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../services/map_navigation_service.dart'; import '../../models/activity.dart'; class ActivityDetailDialog extends StatelessWidget { final Activity activity; const ActivityDetailDialog({super.key, required this.activity}); @override Widget build(BuildContext context) { final theme = Theme.of(context); // final isDarkMode = theme.brightness == Brightness.dark; // Traduction de la catégorie String categoryDisplay = activity.category; final categoryEnum = ActivityCategory.values.firstWhere( (e) => e.name == activity.category, orElse: () => ActivityCategory.attraction, // Fallback ); categoryDisplay = categoryEnum.displayName; return Dialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), backgroundColor: theme.scaffoldBackgroundColor, child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Image header if (activity.imageUrl != null && activity.imageUrl!.isNotEmpty) ClipRRect( borderRadius: const BorderRadius.vertical( top: Radius.circular(16), ), child: Image.network( activity.imageUrl!, height: 200, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) => Container( height: 100, color: Colors.grey[300], child: const Icon(Icons.image_not_supported, size: 50), ), ), ), Padding( padding: const EdgeInsets.all(20), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // Titre et Catégorie Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( activity.name, style: theme.textTheme.headlineSmall?.copyWith( fontWeight: FontWeight.bold, ), ), ), Container( padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( color: theme.colorScheme.primary.withValues( alpha: 0.1, ), borderRadius: BorderRadius.circular(20), ), child: Text( categoryDisplay, style: TextStyle( color: theme.colorScheme.primary, fontWeight: FontWeight.bold, fontSize: 12, ), ), ), ], ), const SizedBox(height: 16), // Date if (activity.date != null) ...[ Row( children: [ Icon( Icons.calendar_today, size: 20, color: Colors.grey[600], ), const SizedBox(width: 8), Text( DateFormat( 'EEEE d MMMM yyyy', 'fr_FR', ).format(activity.date!), style: theme.textTheme.bodyMedium, ), ], ), const SizedBox(height: 16), ], // Heures d'ouverture if (activity.openingHours.isNotEmpty) ...[ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Icon( Icons.access_time, size: 20, color: Colors.grey[600], ), const SizedBox(width: 8), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: activity.openingHours .map( (hour) => Padding( padding: const EdgeInsets.only(bottom: 4), child: Text( hour, style: theme.textTheme.bodyMedium, ), ), ) .toList(), ), ), ], ), const SizedBox(height: 16), ], // Adresse if (activity.address != null) ...[ Row( children: [ Icon( Icons.location_on, size: 20, color: Colors.grey[600], ), const SizedBox(width: 8), Expanded( child: Text( activity.address!, style: theme.textTheme.bodyMedium, ), ), ], ), const SizedBox(height: 16), ], // Description if (activity.description.isNotEmpty) ...[ Text( 'Description', style: theme.textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), Text( activity.description, style: theme.textTheme.bodyMedium, ), const SizedBox(height: 16), ], // Votes if (activity.votes.isNotEmpty) ...[ const Divider(), const SizedBox(height: 8), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildVoteStat( Icons.thumb_up, Colors.green, activity.positiveVotes, 'Pour', ), _buildVoteStat( Icons.thumb_down, Colors.red, activity.negativeVotes, 'Contre', ), ], ), ], ], ), ), // Boutons Padding( padding: const EdgeInsets.all(16), child: Column( children: [ if (activity.latitude != null && activity.longitude != null) Padding( padding: const EdgeInsets.only(bottom: 8), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ ElevatedButton.icon( onPressed: () { // Déclencher la navigation context .read() .navigateToLocation( activity.latitude!, activity.longitude!, name: activity.name, ); // Revenir à la page d'accueil (fermer le dialog et les pages empilées comme ActivitiesPage) Navigator.of( context, ).popUntil((route) => route.isFirst); }, icon: const Icon(Icons.map_outlined), label: const Text('Voir sur la carte de l\'app'), style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric( vertical: 12, horizontal: 24, ), backgroundColor: theme.colorScheme.secondaryContainer, foregroundColor: theme.colorScheme.onSecondaryContainer, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ), const SizedBox(height: 8), ElevatedButton.icon( onPressed: () async { final url = Uri.parse( 'https://www.google.com/maps/search/?api=1&query=${activity.latitude},${activity.longitude}', ); if (await canLaunchUrl(url)) { await launchUrl( url, mode: LaunchMode.externalApplication, ); } }, icon: const Icon(Icons.map), label: const Text('Voir sur Google Maps'), style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric( vertical: 12, horizontal: 24, ), backgroundColor: theme.colorScheme.primaryContainer, foregroundColor: theme.colorScheme.onPrimaryContainer, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ), ], ), ), ElevatedButton( onPressed: () => Navigator.pop(context), style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), minimumSize: const Size(double.infinity, 45), ), child: const Text('Fermer'), ), ], ), ), ], ), ), ); } Widget _buildVoteStat(IconData icon, Color color, int count, String label) { return Column( children: [ Icon(icon, color: color), const SizedBox(height: 4), Text( '$count', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: color, ), ), Text(label, style: const TextStyle(fontSize: 12, color: Colors.grey)), ], ); } }