import 'package:flutter/material.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../models/service_model.dart'; // Importa gli altri modelli se sono in file separati class ServicesRepository { final _supabase = Supabase.instance.client; // --- RECUPERO TUTTI I SERVIZI --- Future> fetchServices({ required int offset, int limit = 50, String? searchTerm, DateTimeRange? dateRange, }) async { try { var query = _supabase.from('service').select(''' *, energy_service(*), fin_service(*), entertainment_service(*) '''); // Filtro per range di date if (dateRange != null) { query = query .gte('created_at', dateRange.start.toIso8601String()) .lte('created_at', dateRange.end.toIso8601String()); } // Ordinamento e Paginazione final response = await query .order('created_at', ascending: false) .range(offset, offset + limit - 1); final List services = (response as List) .map((map) => ServiceModel.fromMap(map)) .toList(); // Filtro testuale lato client per semplicità (o potresti farlo in SQL se preferisci) if (searchTerm != null && searchTerm.isNotEmpty) { return services.where((s) { // Qui cercheremo per numero pratica o note (il nome cliente lo vedremo poi con le Join) return s.number.toLowerCase().contains(searchTerm.toLowerCase()) || s.note.toLowerCase().contains(searchTerm.toLowerCase()); }).toList(); } return services; } catch (e) { throw Exception('Errore fetch: $e'); } } // --- SALVATAGGIO COMPLETO (A CASCATA) --- Future saveFullService(ServiceModel service) async { try { // 1. Inserimento Padre final serviceData = await _supabase .from('service') .insert(service.toMap()) .select() .single(); final String newId = serviceData['id']; // 2. Inserimento Energy (se presenti) if (service.energyServices.isNotEmpty) { final List> energyToInsert = []; for (var item in service.energyServices) { energyToInsert.add(item.copyWith(serviceId: newId).toMap()); } await _supabase.from('energy_service').insert(energyToInsert); } // 3. Inserimento Finanziamenti (se presenti) if (service.finServices.isNotEmpty) { final List> finToInsert = []; for (var item in service.finServices) { finToInsert.add(item.copyWith(serviceId: newId).toMap()); } await _supabase.from('fin_service').insert(finToInsert); } // 4. Inserimento Entertainment (se presenti) if (service.entertainmentServices.isNotEmpty) { final List> entToInsert = []; for (var item in service.entertainmentServices) { entToInsert.add(item.copyWith(serviceId: newId).toMap()); } await _supabase.from('entertainment_service').insert(entToInsert); } } catch (e) { throw Exception('Errore durante il salvataggio: $e'); } } // --- ELIMINAZIONE --- // Grazie ai "ON DELETE CASCADE" che hai messo nell'SQL, // cancellando il padre Supabase pialla automaticamente i figli. Top! Future deleteService(String id) async { try { await _supabase.from('service').delete().eq('id', id); } catch (e) { throw Exception('Errore durante l\'eliminazione: $e'); } } }