import 'package:cloud_firestore/cloud_firestore.dart'; import 'dart:math'; import 'dart:async'; import 'cid_data_manager.dart'; import 'global_data.dart'; class FirebaseExchange { static final FirebaseFirestore _db = FirebaseFirestore.instance; static const String collectionName = 'scambi_cid'; // --- LATO CHE GENERA IL QR (Host) --- static Future> avviaSessioneRealTime() async { String sessionId = _generaCodiceUnivoco(); String mioLato = GlobalData.latoCorrente; // Estrazione dati Map mieiDati = CidDataManager.estraiDatiPerExport(); Map payload = { 'created_at': FieldValue.serverTimestamp(), 'expires_at': DateTime.now().add(const Duration(minutes: 10)).millisecondsSinceEpoch, 'dati_$mioLato': mieiDati, }; // Scrittura su Firebase await _db.collection(collectionName).doc(sessionId).set(payload); return { 'sessionId': sessionId, 'stream': _db.collection(collectionName).doc(sessionId).snapshots() }; } // --- LATO CHE SCANSIONA (Guest) --- static Future completaScambio(String sessionId) async { try { sessionId = sessionId.trim().toUpperCase(); DocumentReference docRef = _db.collection(collectionName).doc(sessionId); DocumentSnapshot doc = await docRef.get(); if (!doc.exists) return false; Map data = doc.data() as Map; String mioLato = GlobalData.latoCorrente; String latoAltro = mioLato == 'A' ? 'B' : 'A'; // 1. Importo i dati dell'altro if (data['dati_$latoAltro'] != null) { CidDataManager.importaDati(data['dati_$latoAltro']); } else { return false; } // 2. Invio i miei dati per completare lo scambio Map mieiDati = CidDataManager.estraiDatiPerExport(); await docRef.update({ 'dati_$mioLato': mieiDati }); return true; } catch (e) { print("Errore durante lo scambio: $e"); return false; } } static String _generaCodiceUnivoco() { const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; Random rnd = Random(); return String.fromCharCodes(Iterable.generate( 6, (_) => chars.codeUnitAt(rnd.nextInt(chars.length)))); } }