|
- import 'dart:io';
- import 'dart:typed_data';
- import 'package:dio/dio.dart';
- import 'package:path/path.dart' as path;
- import '../models/content_post.dart';
-
- /// Service API pour l'amélioration IA et la génération de texte
- class ApiService {
- late final Dio _dio;
-
- static const String baseUrl = 'https://api.your-ai-provider.com';
- static const String aiEnhancementEndpoint = '/api/v1/enhance-image';
- static const String textGenerationEndpoint = '/api/v1/generate-text';
-
- ApiService() {
- _dio = Dio(
- BaseOptions(
- baseUrl: baseUrl,
- connectTimeout: const Duration(seconds: 30),
- receiveTimeout: const Duration(seconds: 30),
- sendTimeout: const Duration(seconds: 30),
- ),
- );
-
- // Ajouter un interceptor pour les logs (development)
- _dio.interceptors.add(
- LogInterceptor(
- requestBody: true,
- responseBody: true,
- error: true,
- ),
- );
- }
-
- /// Améliorer un média via l'API IA
- Future<EnhancementResult> enhanceMedia(
- File mediaFile, {
- required MediaType mediaType,
- }) async {
- try {
- final fileName = path.basename(mediaFile.path);
- final bytes = await mediaFile.readAsBytes();
-
- final formData = FormData.fromMap({
- 'media': MultipartFile.fromBytes(bytes, filename: fileName),
- 'type': mediaType.name,
- 'versions': '3',
- });
-
- final response = await _dio.post<Map<String, dynamic>>(
- aiEnhancementEndpoint,
- data: formData,
- );
-
- if (response.statusCode == 200) {
- final data = response.data!;
- final versions = <File>[];
-
- // Parser les URLs retournées et télécharger
- if (data['urls'] is List) {
- for (final url in data['urls'] as List) {
- final file = await _downloadFile(url.toString());
- versions.add(file);
- }
- }
-
- return (
- versions: versions,
- processedAt: DateTime.now(),
- error: null,
- );
- } else {
- throw Exception('API error: ${response.statusCode}');
- }
- } on DioException catch (e) {
- return (
- versions: const <File>[],
- processedAt: DateTime.now(),
- error: e.message ?? 'Unknown error',
- );
- } catch (e) {
- return (
- versions: const <File>[],
- processedAt: DateTime.now(),
- error: e.toString(),
- );
- }
- }
-
- /// Générer du texte basé sur le profil et les préférences
- Future<TextGenerationResult> generateTextProposals({
- required String profession,
- required String tone,
- required String style,
- required bool includeEmojis,
- required bool includeCommercialInfo,
- String? mediaDescription,
- }) async {
- try {
- final response = await _dio.post<Map<String, dynamic>>(
- textGenerationEndpoint,
- data: {
- 'profession': profession,
- 'tone': tone,
- 'style': style,
- 'include_emojis': includeEmojis,
- 'include_commercial_info': includeCommercialInfo,
- 'media_description': mediaDescription,
- 'num_proposals': 3,
- },
- );
-
- if (response.statusCode == 200) {
- final data = response.data!;
- final proposals = List<String>.from(data['proposals'] as List? ?? []);
-
- return (
- proposals: proposals,
- generatedAt: DateTime.now(),
- error: null,
- );
- } else {
- throw Exception('API error: ${response.statusCode}');
- }
- } on DioException catch (e) {
- // Retourner des proposals mock pour le développement
- return (
- proposals: _getMockProposals(includeEmojis),
- generatedAt: DateTime.now(),
- error: e.message,
- );
- } catch (e) {
- return (
- proposals: _getMockProposals(includeEmojis),
- generatedAt: DateTime.now(),
- error: e.toString(),
- );
- }
- }
-
- /// Télécharger un fichier depuis une URL
- Future<File> _downloadFile(String urlString) async {
- try {
- final response = await _dio.get<Uint8List>(
- urlString,
- options: Options(responseType: ResponseType.bytes),
- );
-
- final dir = Directory.systemTemp;
- final file = File('${dir.path}/enhanced_${DateTime.now().millisecondsSinceEpoch}.jpg');
- await file.writeAsBytes(response.data!);
-
- return file;
- } catch (e) {
- throw Exception('Failed to download file: $e');
- }
- }
-
- /// Propositions mock pour le développement
- List<String> _getMockProposals(bool withEmojis) {
- if (withEmojis) {
- return [
- '🌟 Découvrez notre nouvelle collection ! ✨ Qualité premium et innovation réunies. 💼 Rejoignez-nous pour transformer vos projets !',
- '💡 Excellence et professionnalisme au rendez-vous ! 🎯 Solutions innovantes pour tous. Faites confiance à notre expertise ! 🚀',
- '🔥 Olé Olé ! 🎉 Créativité et style sans limites. Vos rêves deviennent réalité avec nous ! ✨🌈',
- ];
- } else {
- return [
- 'Découvrez notre nouvelle collection. Qualité premium et innovation réunies. Rejoignez-nous pour transformer vos projets.',
- 'Excellence et professionnalisme au rendez-vous. Solutions innovantes pour tous. Faites confiance à notre expertise.',
- 'Créativité et style sans limites. Vos rêves deviennent réalité avec nous.',
- ];
- }
- }
- }
|