// lib/repositories/ai_repository.dart // 1. IMPORTER LES INTERFACES ET LES IMPLÉMENTATIONS NÉCESSAIRES // Le fichier ollama_service.dart contient nos nouvelles classes découpées. import '../services/ollama_service.dart'; import '../services/stable_diffusion_service.dart'; import '../services/gemini_service.dart'; import '../services/image_editing_service.dart'; // Énumération pour choisir le modèle de génération d'image. enum ImageGenerationModel { stableDiffusion, gemini } /// Le AiRepository est le point d'entrée centralisé pour toutes les opérations d'IA. /// L'interface utilisateur ne parlera qu'à ce Repository. class AiRepository { // --- NOS SERVICES SPÉCIALISÉS --- // Pour l'analyse initiale de l'image ("prompt 1"). // On utilise l'implémentation Ollama, mais on ne dépend que de l'interface. final ImageAnalysisService _imageAnalyzer = OllamaImageAnalysisService(); // Pour générer les idées de posts. final PostCreationService _postCreator = OllamaPostCreationService(); // Pour améliorer le texte. final TextImprovementService _textImprover = OllamaTextImprovementService(); // Une collection de services pour la GÉNÉRATION D'IMAGES. final Map _imageGenerators; // Le constructeur initialise la collection de générateurs d'images. AiRepository() : _imageGenerators = { ImageGenerationModel.stableDiffusion: StableDiffusionService(), ImageGenerationModel.gemini: GeminiService(), }; // --- LES MÉTHODES PUBLIQUES UTILISÉES PAR L'INTERFACE UTILISATEUR --- /// Étape: `MediaPickerScreen` -> `AiEnhancementScreen` /// Analyse l'image pour obtenir une description textuelle (le "prompt 1"). /// C'est la tâche qui est lancée "en amont". Future analyzeImageForPrompt(String base64Image) { print("[AiRepository] Délégation de l'analyse de l'image à l'ImageAnalyzer..."); return _imageAnalyzer.analyzeImage(base64Image); } /// Étape: `AiEnhancementScreen` /// Génère de nouvelles versions d'une image en utilisant un modèle spécifique. Stream generateImageVariations({ required ImageGenerationModel model, required String base64Image, required String prompt, required int width, required int height, int numberOfImages = 1, }) { print("[AiRepository] Délégation de la génération d'images au modèle : $model"); final generator = _imageGenerators[model]; if (generator == null) { // Retourne un stream avec une erreur si le modèle n'est pas configuré. return Stream.error(Exception("Le modèle de génération d'image '$model' n'est pas disponible.")); } return generator.editImage(base64Image, prompt, width, height, numberOfImages: numberOfImages); } /// Étape: `TextGenerationScreen` /// Génère des idées de posts basées sur l'image et un profil utilisateur. Future> generatePostIdeas({ required String base64Image, required String profession, required String tone, }) { print("[AiRepository] Délégation de la création de posts au PostCreator..."); return _postCreator.generatePostIdeas( base64Image: base64Image, profession: profession, tone: tone, ); } /// Étape: `PostRefinementScreen` /// Améliore un texte existant selon une instruction. Future improvePostText({ required String originalText, required String userInstruction, }) { print("[AiRepository] Délégation de l'amélioration du texte au TextImprover..."); return _textImprover.improveText( originalText: originalText, userInstruction: userInstruction, ); } }