import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; class ApiService { // Use 10.0.2.2 for Android Emulator, localhost for iOS/Web static final String baseUrl = Platform.isAndroid ? 'http://10.0.2.2:3000' : 'http://localhost:3000'; final Dio _dio = Dio( BaseOptions( baseUrl: baseUrl, connectTimeout: const Duration(seconds: 10), receiveTimeout: const Duration(seconds: 10), ), ); // Get Initial Master Data (Groups, Species, Breeds, Diseases) Future> getInitialData() async { try { final response = await _dio.get('/common/initial-data'); return response.data; } catch (e) { debugPrint('Error fetching initial data: $e'); rethrow; } } // Register Pet Future> registerPet({ required int userId, required String name, required String species, required String breed, required String gender, required bool isNeutered, DateTime? birthDate, required bool isDateUnknown, double? weight, String? registrationNumber, File? profileImage, List? diseases, List? pastDiseases, List? healthConcerns, }) async { try { final formData = await _createPetFormData( userId: userId, name: name, species: species, breed: breed, gender: gender, isNeutered: isNeutered, birthDate: birthDate, isDateUnknown: isDateUnknown, weight: weight, registrationNumber: registrationNumber, profileImage: profileImage, diseases: diseases, pastDiseases: pastDiseases, healthConcerns: healthConcerns, ); final response = await _dio.post('/pets', data: formData); return response.data; } catch (e) { debugPrint('Error registering pet: $e'); rethrow; } } Future> updatePet({ required int petId, required String name, required String species, required String breed, required String gender, required bool isNeutered, DateTime? birthDate, required bool isDateUnknown, double? weight, String? registrationNumber, File? profileImage, List? diseases, List? pastDiseases, List? healthConcerns, }) async { try { final formData = await _createPetFormData( name: name, species: species, breed: breed, gender: gender, isNeutered: isNeutered, birthDate: birthDate, isDateUnknown: isDateUnknown, weight: weight, registrationNumber: registrationNumber, profileImage: profileImage, diseases: diseases, pastDiseases: pastDiseases, healthConcerns: healthConcerns, ); final response = await _dio.put('/pets/$petId', data: formData); return response.data; } catch (e) { debugPrint('Error updating pet: $e'); rethrow; } } // Helper: Create FormData Future _createPetFormData({ required String name, required String species, required String breed, required String gender, required bool isNeutered, DateTime? birthDate, required bool isDateUnknown, double? weight, String? registrationNumber, File? profileImage, List? diseases, List? pastDiseases, List? healthConcerns, int? userId, // Optional (only for register) }) async { final map = { if (userId != null) 'userId': userId, 'name': name, 'species': species, 'breed': breed, 'gender': gender, 'isNeutered': isNeutered, 'birthDate': birthDate?.toIso8601String(), 'isDateUnknown': isDateUnknown, 'weight': weight, 'registrationNumber': registrationNumber, 'diseases': diseases != null ? jsonEncode(diseases) : '[]', 'pastDiseases': pastDiseases != null ? jsonEncode(pastDiseases) : '[]', 'healthConcerns': healthConcerns != null ? jsonEncode(healthConcerns) : '[]', }; if (profileImage != null) { map['profileImage'] = await MultipartFile.fromFile( profileImage.path, filename: profileImage.path.split('/').last, ); } return FormData.fromMap(map); } // Get Pets Future> getPets(int userId) async { try { final response = await _dio.get( '/pets', queryParameters: {'userId': userId}, ); return response.data; } catch (e) { debugPrint('Error fetching pets: $e'); rethrow; } } // --- Schedule APIs --- // Get Monthly Schedules Future> getSchedules({ required String petId, required int year, required int month, }) async { try { final response = await _dio.get( '/schedules', queryParameters: {'petId': petId, 'year': year, 'month': month}, ); return response.data; } catch (e) { debugPrint('Error fetching schedules: $e'); rethrow; } } // Create Schedule Future> createSchedule(Map data) async { try { final response = await _dio.post('/schedules', data: data); return response.data; } catch (e) { debugPrint('Error creating schedule: $e'); rethrow; } } // Update Schedule Future> updateSchedule( String id, Map data, ) async { try { final response = await _dio.put('/schedules/$id', data: data); return response.data; } catch (e) { debugPrint('Error updating schedule: $e'); rethrow; } } // Delete Schedule Future deleteSchedule(String id) async { try { await _dio.delete('/schedules/$id'); } catch (e) { debugPrint('Error deleting schedule: $e'); rethrow; } } }