import 'package:get/get.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../models/field_party.dart'; import '../models/field_property.dart'; /// Ingatlan-nyilvántartás lekérdezései — SZÁNDÉKOSAN tisztán online, /// nincs helyi outbox/tükör-tábla (a kapcsolatokkal/mérésekkel /// ellentétben). Ez az adat nem kerülhet a készülék adatbázisába. class FieldPropertyService extends GetxService { static FieldPropertyService get to => Get.find(); SupabaseClient get _client => Supabase.instance.client; /// Ingatlanok listája, kereséssel/szűréssel. Future> listProperties({ required String projectId, String? search, String? settlement, String? mailingStatus, }) async { var query = _client .from('terepi_seged_field_properties_view') .select() .eq('project_id', projectId); if (settlement != null && settlement.isNotEmpty) { query = query.eq('settlement', settlement); } if (mailingStatus != null && mailingStatus.isNotEmpty) { query = query.eq('mailing_status', mailingStatus); } if (search != null && search.trim().isNotEmpty) { final s = search.trim().replaceAll(',', ' '); query = query.or( 'parcel_number.ilike.%$s%,owner_names.ilike.%$s%,settlement.ilike.%$s%', ); } final rows = await query .order('settlement', ascending: true) .order('parcel_number', ascending: true) .limit(1000); return rows.map((r) => FieldProperty.fromMap(r)).toList(); } /// Tulajdonosok keresése név szerint. Future> searchParties({ required String projectId, String? search, }) async { var query = _client .from('terepi_seged_field_parties_view') .select() .eq('project_id', projectId); if (search != null && search.trim().isNotEmpty) { query = query.ilike('name', '%${search.trim()}%'); } final rows = await query.order('name', ascending: true).limit(1000); return rows.map((r) => FieldParty.fromMap(r)).toList(); } /// Egy adott tulajdonos ÖSSZES ingatlana. Future> listPropertiesForParty(String partyId) async { final links = await _client .from('terepi_seged_field_property_parties') .select('property_id') .eq('party_id', partyId) .eq('is_current', true); final propertyIds = links.map((r) => r['property_id'] as String).toSet().toList(); if (propertyIds.isEmpty) return []; final rows = await _client .from('terepi_seged_field_properties_view') .select() .inFilter('id', propertyIds) .order('settlement') .order('parcel_number'); return rows.map((r) => FieldProperty.fromMap(r)).toList(); } /// Egy ingatlan tulajdonosi/kezelői bontása, tulajdoni hányaddal — a /// részletnézethez. Future>> propertyOwnershipDetail( String propertyId) async { final rows = await _client .from('terepi_seged_field_property_parties') .select('*, terepi_seged_field_parties(name, party_type)') .eq('property_id', propertyId) .eq('is_current', true); return List>.from(rows); } }