import 'dart:typed_data'; import 'package:flux/features/tickets/models/shipment_document_model.dart'; import 'package:flux/features/master_data/providers/models/provider_model.dart'; import 'package:flux/features/master_data/providers/models/provider_role.dart'; import 'package:get_it/get_it.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class TicketsShipmentRepository { final _supabase = GetIt.I.get(); Future> fetchRepairCenters() async { try { final response = await _supabase .from('provider') .select('*, provider_locations (*)') .eq('is_active', true) .order('name'); final allProviders = (response as List) .map((row) => ProviderModel.fromMap(row as Map)) .toList(); // Filtriamo lato client per prendere SOLO i repairCenter return allProviders .where((p) => p.roles.contains(ProviderRole.repairCenter)) .toList(); } catch (e) { throw ('Errore caricamento laboratori: $e'); } } /// Salva il DDT nel DB, fa l'upload del PDF nello Storage e aggiorna il path Future createShipmentWithPdf({ required ShipmentDocumentModel document, required Uint8List pdfBytes, required String newTicketStatus, }) async { try { // 1. Definiamo un percorso unico e ordinato per il file nello Storage // Struttura: company_id / ddt / anno / numero_ddt.pdf final year = document.docDate.year; final cleanedDocNumber = document.docNumber .replaceAll('/', '_') .replaceAll(' ', '_'); final storagePath = '${document.companyId}/ddt/$year/$cleanedDocNumber.pdf'; // 2. Facciamo l'upload dei bytes grezzi nel bucket 'company_documents' await _supabase.storage .from('company_documents') .uploadBinary( storagePath, pdfBytes, fileOptions: const FileOptions( contentType: 'application/pdf', upsert: true, ), ); // 3. Creiamo la mappa del documento includendo il percorso dello storage final documentData = document.toMap(); documentData['storage_path'] = storagePath; // 4. Inseriamo il Documento di Trasporto nel DB final savedDocument = await _supabase .from('shipment_documents') .insert(documentData) .select('id') .single(); final documentid = savedDocument['id']; // 5. Aggiorniamo lo stato di TUTTI i ticket inclusi nel DDT await _supabase .from('ticket') .update({ 'ticket_status': newTicketStatus, 'shipment_document_id': documentid, }) .inFilter('id', document.ticketIds); // Restituiamo lo storagePath per usarlo subito nell'interfaccia se serve return storagePath; } catch (e) { throw ('Errore durante il salvataggio e upload della spedizione: $e'); } } }