using Domain.Dtos;
using Domain.Entities;
using Microsoft.JSInterop;
using System.Net.Http.Json;
namespace phronCare.UIBlazor.Services.Stock.Expeditions
{
public class ExpeditionService
{
private readonly IJSRuntime _js; //Todavia no se utiliza pero eventualmente para exportaciones seguramente./
private readonly HttpClient _http;
public ExpeditionService(HttpClient http, IJSRuntime js)
{
_js = js;
_http = http;
}
///
/// Obtiene un presupuesto por QuoteNumber.
///
public async Task GetQuoteByNumberAsync(string quoteNumber)
{
try
{
var result = await _http.GetFromJsonAsync($"api/quote/summary/{quoteNumber}");
return result;
}
catch (Exception ex)
{
Console.WriteLine($"Error al obtener QuoteDto por QuoteNumber: {ex.Message}");
return null;
}
}
///
/// Envía el header + details de la expedición junto con el formSeriesId
/// y recibe el número de expedición generado o un mensaje de error.
///
public async Task CreateAndIssueAsync(
ELSExpeditionHeader header,
IEnumerable details,
int formSeriesId)
{
// 1) Poner los ítems dentro del header
header.PhLsmExpeditionDetails = details?.ToList() ?? new List();
var request = new CreateFullExpeditionRequest
{
Expedition = header,
FormSeriesId = formSeriesId
};
var response = await _http.PostAsJsonAsync("/api/expedition/createfull", request);
if (!response.IsSuccessStatusCode)
{
var serverMessage = await response.Content.ReadAsStringAsync();
return new CreateExpeditionResult
{
Success = false,
ErrorMessage = serverMessage
};
}
var result = await response.Content.ReadFromJsonAsync();
return result ?? new CreateExpeditionResult { Success = false, ErrorMessage = "Respuesta vacía del servidor." };
}
///
/// Obtiene la expedición completa por ID para visualización (drawer/pantalla de detalle).
///
public async Task GetDtoByIdAsync(int id)
{
try
{
var dto = await _http.GetFromJsonAsync($"/expedition/{id}");
return dto;
}
catch (Exception ex)
{
Console.WriteLine($"Error al obtener ExpeditionDto por ID: {ex.Message}");
return null;
}
}
///
/// Descarga el PDF de la expedición en el navegador usando saveAsFile (base64).
///
public async Task ExportPdfAsync(int expeditionId, string expeditionNumber)
{
try
{
var response = await _http.GetAsync($"/api/expedition/{expeditionId}/pdf");
if (!response.IsSuccessStatusCode)
{
var error = await response.Content.ReadAsStringAsync();
throw new Exception($"Error al generar PDF: {error}");
}
var bytes = await response.Content.ReadAsByteArrayAsync();
var base64 = Convert.ToBase64String(bytes);
var fileName = $"{expeditionNumber}.pdf";
await _js.InvokeVoidAsync("saveAsFile", fileName, base64);
}
catch (Exception ex)
{
var message = ex.Message ?? "No message";
throw new Exception($"ExportPdfAsync: {message}", ex);
}
}
}
///
/// Contrato de request simétrico a CreateFullQuoteRequest.
///
public class CreateFullExpeditionRequest
{
public ELSExpeditionHeader Expedition { get; set; } = default!;
public int FormSeriesId { get; set; }
}
///
/// Resultado del create/issue simétrico a CreateQuoteResult.
///
public class CreateExpeditionResult
{
public bool Success { get; set; }
public int Id { get; set; }
public string ExpeditionNumber { get; set; } = string.Empty;
public string ErrorMessage { get; set; } = string.Empty;
}
// TODO: Ajustar namespace real si es distinto
public class ExpeditionDto
{
// Estructura mínima para compilar si aún no referenciás el DTO real.
// Reemplazar por el DTO definitivo de Domain.Dtos.
public int Id { get; set; }
public string ExpeditionNumber { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
public DateTime IssueDate { get; set; }
public string? CustomerName { get; set; }
public string? ProfessionalName { get; set; }
public string? InstitutionName { get; set; }
public string? PatientName { get; set; }
public List Items { get; set; } = new();
public string? Observations { get; set; }
}
public class ExpeditionItemDto
{
public int ProductId { get; set; }
public string ProductName { get; set; } = string.Empty;
public decimal Quantity { get; set; }
public string? Batch { get; set; }
public string? Serial { get; set; }
public DateOnly? Expiration { get; set; }
public int? LocationId { get; set; }
}
}