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<Map<String, dynamic>> avviaSessioneRealTime() async {
    String sessionId = _generaCodiceUnivoco();
    String mioLato = GlobalData.latoCorrente;

    // Estrazione dati
    Map<String, dynamic> mieiDati = CidDataManager.estraiDatiPerExport();

    Map<String, dynamic> 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<bool> 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<String, dynamic> data = doc.data() as Map<String, dynamic>;
      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<String, dynamic> 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))));
  }
}