using Domain.Dtos.Sales; using Domain.Generics; using System.Net.Http.Json; namespace phronCare.UIBlazor.Services.Sales.SalesDocuments { public sealed class SalesDocumentService : ISalesDocumentService { private readonly HttpClient _http; public SalesDocumentService(HttpClient http) { _http = http; } public async Task> SearchAsync(SalesDocumentSearchParams searchParams) { ArgumentNullException.ThrowIfNull(searchParams); var queryParams = new List(); void AddParam(string key, string? value) { if (!string.IsNullOrWhiteSpace(value)) queryParams.Add($"{key}={Uri.EscapeDataString(value)}"); } AddParam("customerId", searchParams.CustomerId?.ToString()); AddParam("customerText", searchParams.CustomerText); AddParam("quoteId", searchParams.QuoteId?.ToString()); AddParam("documentType", searchParams.DocumentType?.ToString()); AddParam("status", searchParams.Status?.ToString()); AddParam("issueDateFrom", searchParams.IssueDateFrom?.ToString("o")); AddParam("issueDateTo", searchParams.IssueDateTo?.ToString("o")); AddParam("page", searchParams.Page.ToString()); AddParam("pageSize", searchParams.PageSize.ToString()); var url = "/api/SalesDocument/search"; if (queryParams.Any()) url += "?" + string.Join("&", queryParams); var result = await _http.GetFromJsonAsync>(url); return result ?? new PagedResult(); } public async Task> SearchDeliveryNoteCandidatesAsync( int? customerId, string? customerText, string? deliveryNoteNumber, int? quoteId, DateTime? issueDateFrom, DateTime? issueDateTo, int page = 1, int pageSize = 50) { var queryParams = new List(); void AddParam(string key, string? value) { if (!string.IsNullOrWhiteSpace(value)) queryParams.Add($"{key}={Uri.EscapeDataString(value)}"); } AddParam("customerId", customerId?.ToString()); AddParam("customerText", customerText); AddParam("deliveryNoteNumber", deliveryNoteNumber); AddParam("quoteId", quoteId?.ToString()); AddParam("issueDateFrom", issueDateFrom?.ToString("o")); AddParam("issueDateTo", issueDateTo?.ToString("o")); AddParam("page", page.ToString()); AddParam("pageSize", pageSize.ToString()); var url = "/api/SalesDocument/delivery-note-candidates"; if (queryParams.Any()) url += "?" + string.Join("&", queryParams); var result = await _http.GetFromJsonAsync>(url); return result ?? new PagedResult(); } public async Task CreateFromDeliveryNotesAsync(SalesDocumentCreateFromDeliveryNotesRequest request) { ArgumentNullException.ThrowIfNull(request); var response = await _http.PostAsJsonAsync("/api/SalesDocument/from-delivery-notes", request); if (!response.IsSuccessStatusCode) { var serverMessage = await response.Content.ReadAsStringAsync(); throw new Exception(string.IsNullOrWhiteSpace(serverMessage) ? "No se pudo crear el Sales Document desde remitos." : serverMessage); } var result = await response.Content.ReadFromJsonAsync(); return result ?? throw new Exception("Respuesta vacía del servidor."); } public async Task GetByIdAsync(int id) { return await _http.GetFromJsonAsync($"/api/SalesDocument/{id}"); } public async Task CreateAsync(SalesDocumentCreateRequest request) { ArgumentNullException.ThrowIfNull(request); var response = await _http.PostAsJsonAsync("/api/SalesDocument", request); if (!response.IsSuccessStatusCode) { var serverMessage = await response.Content.ReadAsStringAsync(); throw new Exception(string.IsNullOrWhiteSpace(serverMessage) ? "No se pudo crear el Sales Document." : serverMessage); } var result = await response.Content.ReadFromJsonAsync(); return result ?? throw new Exception("Respuesta vacía del servidor."); } } }