using System.Text; using System.Text.Json; using NimbusFlow.Frontend.Models; namespace NimbusFlow.Frontend.Services { public class ApiService : IApiService { private readonly HttpClient _httpClient; private readonly JsonSerializerOptions _jsonOptions; public ApiService(HttpClient httpClient) { _httpClient = httpClient; _jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, PropertyNameCaseInsensitive = true }; } // Member operations public async Task> GetMembersAsync() { var response = await _httpClient.GetAsync("members"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } public async Task GetMemberAsync(int id) { var response = await _httpClient.GetAsync($"members/{id}"); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) return null; response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(json, _jsonOptions); } public async Task CreateMemberAsync(Member member) { var json = JsonSerializer.Serialize(member, _jsonOptions); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync("members", content); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions) ?? member; } public async Task UpdateMemberAsync(Member member) { var json = JsonSerializer.Serialize(member, _jsonOptions); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _httpClient.PutAsync($"members/{member.MemberId}", content); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions) ?? member; } public async Task DeleteMemberAsync(int id) { var response = await _httpClient.DeleteAsync($"members/{id}"); return response.IsSuccessStatusCode; } // Classification operations public async Task> GetClassificationsAsync() { var response = await _httpClient.GetAsync("classifications"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } // Service operations public async Task> GetServicesAsync() { var response = await _httpClient.GetAsync("services"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } public async Task GetServiceAsync(int id) { var response = await _httpClient.GetAsync($"services/{id}"); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) return null; response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(json, _jsonOptions); } public async Task CreateServiceAsync(Service service) { var json = JsonSerializer.Serialize(service, _jsonOptions); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync("services", content); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions) ?? service; } // Schedule operations public async Task> GetSchedulesAsync() { var response = await _httpClient.GetAsync("schedules"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } public async Task> GetMemberSchedulesAsync(int memberId) { var response = await _httpClient.GetAsync($"members/{memberId}/schedules"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } public async Task GetScheduleAsync(int id) { var response = await _httpClient.GetAsync($"schedules/{id}"); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) return null; response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(json, _jsonOptions); } public async Task AcceptScheduleAsync(int scheduleId) { var response = await _httpClient.PostAsync($"schedules/{scheduleId}/accept", null); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions) ?? new Schedule(); } public async Task DeclineScheduleAsync(int scheduleId, string? reason = null) { var content = new StringContent( JsonSerializer.Serialize(new { reason }, _jsonOptions), Encoding.UTF8, "application/json" ); var response = await _httpClient.PostAsync($"schedules/{scheduleId}/decline", content); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions) ?? new Schedule(); } public async Task RemoveScheduleAsync(int scheduleId) { var response = await _httpClient.DeleteAsync($"schedules/{scheduleId}"); return response.IsSuccessStatusCode; } public async Task ScheduleNextMemberAsync(int serviceId, List classificationIds) { var content = new StringContent( JsonSerializer.Serialize(new { serviceId, classificationIds }, _jsonOptions), Encoding.UTF8, "application/json" ); var response = await _httpClient.PostAsync("schedules/schedule-next", content); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) return null; response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseJson, _jsonOptions); } public async Task> GetServiceTypesAsync() { var response = await _httpClient.GetAsync("service-types"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize>(json, _jsonOptions) ?? new List(); } } }