// lib/presentation/screens/media_picker/media_picker_screen.dart import 'dart:convert'; // <<< NÉCESSAIRE POUR BASE64 import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:social_content_creator/routes/app_routes.dart'; import 'package:social_content_creator/services/image_analysis_service.dart'; // <<< IMPORT CORRECT class MediaPickerScreen extends StatefulWidget { const MediaPickerScreen({super.key}); @override State createState() => _MediaPickerScreenState(); } class _MediaPickerScreenState extends State { final _picker = ImagePicker(); XFile? _selectedMedia; // On instancie la classe CONCRÈTE final ImageAnalysisService _analysisService = OllamaImageAnalysisService(); bool _isAnalyzing = false; Future _pickImage(ImageSource source) async { try { final file = await _picker.pickImage(source: source, imageQuality: 85, maxWidth: 1280); if (file != null) { setState(() => _selectedMedia = file); _analyzeAndNavigate(); } } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Erreur lors de la sélection de l'image: $e")), ); } } /// Fonction qui analyse l'image et navigue vers l'écran suivant. Future _analyzeAndNavigate() async { if (_selectedMedia == null) return; setState(() => _isAnalyzing = true); try { final imageFile = File(_selectedMedia!.path); // --- CORRECTION APPLIQUÉE ICI --- // 1. Convertir l'image en base64, comme attendu par le service. final imageBytes = await imageFile.readAsBytes(); final String imageBase64 = base64Encode(imageBytes); // 2. Appeler la bonne méthode (`analyzeImage`) avec le bon argument (`base64Image`). final String imagePrompt = await _analysisService.analyzeImage(imageBase64); // --- FIN DE LA CORRECTION --- if (!mounted) return; // 3. Navigation avec l'image et le prompt Navigator.pushNamed( context, AppRoutes.aiEnhancement, arguments: { 'image': imageFile, 'prompt': imagePrompt, }, ); } catch (e) { if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Erreur lors de l'analyse de l'image : $e")), ); } finally { if (mounted) { setState(() => _isAnalyzing = false); } } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('1. Choisir une Image')), body: Stack( children: [ SafeArea( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Expanded( child: Center( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Icon(Icons.camera_enhance, size: 80, color: Colors.grey), const SizedBox(height: 24), Text( "Choisissez une image pour commencer", style: Theme.of(context).textTheme.headlineSmall, textAlign: TextAlign.center, ), const SizedBox(height: 48), FilledButton.icon( onPressed: _isAnalyzing ? null : () => _pickImage(ImageSource.gallery), icon: const Icon(Icons.photo_library_outlined), label: const Text('Importer depuis la galerie'), style: FilledButton.styleFrom(padding: const EdgeInsets.symmetric(vertical: 12)), ), const SizedBox(height: 12), OutlinedButton.icon( onPressed: _isAnalyzing ? null : () => _pickImage(ImageSource.camera), icon: const Icon(Icons.camera_alt_outlined), label: const Text('Prendre une photo'), style: OutlinedButton.styleFrom(padding: const EdgeInsets.symmetric(vertical: 12)), ), ], ), ), ), ), ], ), ), if (_isAnalyzing) Container( color: Colors.black.withOpacity(0.5), child: const Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ CircularProgressIndicator(), SizedBox(height: 16), Text("Analyse de l'image...", style: TextStyle(color: Colors.white, fontSize: 16)), ], ), ), ), ], ), ); } }