import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http_parser/http_parser.dart'; import '../../../core/network/api_client.dart'; import '../models/incident.dart'; final incidentServiceProvider = Provider((ref) { return IncidentService(ref.read(apiClientProvider)); }); class IncidentService { IncidentService(this._dio); final Dio _dio; Future> listUnits() async { final res = await _dio.get>( '/incidents/units', options: Options( receiveTimeout: const Duration(seconds: 6), sendTimeout: const Duration(seconds: 6), ), ); return (res.data ?? []) .whereType() .map((e) => UnitOption.fromJson(Map.from(e))) .toList(); } /// Devuelve la unidad asignada al domicilio (vía su ruta). /// `null` si el backend responde 404 (sin ruta o sin unidad). Future getAddressUnit(String addressId) async { try { final res = await _dio.get>( '/addresses/$addressId/unit', options: Options( receiveTimeout: const Duration(seconds: 6), sendTimeout: const Duration(seconds: 6), ), ); if (res.data == null) return null; return UnitOption.fromJson(res.data!); } on DioException catch (e) { if (e.response?.statusCode == 404) return null; rethrow; } } Future createIncident({ required String category, required String description, int? unitId, File? photo, }) async { final form = FormData.fromMap({ 'category': category, 'description': description, if (unitId != null) 'unit_id': unitId, if (photo != null) 'photo': await MultipartFile.fromFile( photo.path, filename: photo.path.split(Platform.pathSeparator).last, contentType: MediaType('image', _ext(photo.path)), ), }); final res = await _dio.post>( '/incidents', data: form, options: Options(contentType: 'multipart/form-data'), ); return IncidentReport.fromJson(res.data!); } Future> myIncidents() async { final res = await _dio.get>('/incidents/me'); return (res.data ?? []) .whereType() .map((e) => IncidentReport.fromJson(Map.from(e))) .toList(); } String _ext(String path) { final dot = path.lastIndexOf('.'); if (dot == -1) return 'jpeg'; final ext = path.substring(dot + 1).toLowerCase(); if (ext == 'jpg') return 'jpeg'; return ext; } }