import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import '../core/constants.dart'; class DatabaseExportService { DatabaseExportService._(); static String _exportFileName() { final date = DateFormat('yyyy-MM-dd_HHmm').format(DateTime.now()); return 'Ristoris_export_$date.db'; } static Future export(BuildContext context) async { if (kIsWeb) { _showError(context, 'Esportazione non supportata su web.'); return; } try { final sourceFile = File( Platform.isAndroid ? '${AppConstants.kAndroidDbDir}/${AppConstants.kDbName}' : p.join( (await getApplicationDocumentsDirectory()).path, AppConstants.kDbName, ), ); if (!await sourceFile.exists()) { if (!context.mounted) return; _showError(context, 'File database non trovato.'); return; } final fileName = _exportFileName(); if (Platform.isAndroid || Platform.isIOS) { final tempDir = await getTemporaryDirectory(); final exportFile = File(p.join(tempDir.path, fileName)); await sourceFile.copy(exportFile.path); await Share.shareXFiles([XFile(exportFile.path)]); } else if (Platform.isLinux) { final home = Platform.environment['HOME'] ?? ''; final downloadsDir = Directory(p.join(home, 'Downloads')); if (!await downloadsDir.exists()) { await downloadsDir.create(recursive: true); } final destFile = File(p.join(downloadsDir.path, fileName)); await sourceFile.copy(destFile.path); } else { final result = await FilePicker.platform.saveFile( dialogTitle: 'Esporta database', fileName: fileName, bytes: await sourceFile.readAsBytes(), ); if (result == null) { if (!context.mounted) return; _showInfo(context, 'Esportazione annullata.'); return; } } if (!context.mounted) return; _showSuccess(context, 'Database esportato con successo.'); } catch (e) { if (!context.mounted) return; _showError(context, 'Errore durante l\'esportazione: $e'); } } static void _showSuccess(BuildContext context, String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message), backgroundColor: Colors.green), ); } static void _showError(BuildContext context, String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message), backgroundColor: Colors.red), ); } static void _showInfo(BuildContext context, String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message)), ); } }