using Elecciones.Core.DTOs; using Microsoft.Extensions.Configuration; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Json; using System.Threading.Tasks; using static Elecciones.Core.DTOs.BancaDto; namespace Elecciones.Infrastructure.Services; public class ElectoralApiService : IElectoralApiService { private readonly IHttpClientFactory _httpClientFactory; private readonly IConfiguration _configuration; public ElectoralApiService(IHttpClientFactory httpClientFactory, IConfiguration configuration) { _httpClientFactory = httpClientFactory; _configuration = configuration; } public async Task GetAuthTokenAsync() { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var username = _configuration["ElectoralApi:Username"]; var password = _configuration["ElectoralApi:Password"]; if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return null; var request = new HttpRequestMessage(HttpMethod.Get, "/api/createtoken/"); request.Headers.Add("username", username); request.Headers.Add("password", password); var response = await client.SendAsync(request); if (!response.IsSuccessStatusCode) return null; var tokenResponse = await response.Content.ReadFromJsonAsync(); return (tokenResponse is { Success: true, Data.AccessToken: not null }) ? tokenResponse.Data.AccessToken : null; } public async Task GetCatalogoAmbitosAsync(string authToken, int categoriaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var request = new HttpRequestMessage(HttpMethod.Get, $"/api/catalogo/getCatalogo?categoriaId={categoriaId}"); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var requestUri = $"/api/catalogo/getAgrupaciones?distritoId={distritoId}&categoriaId={categoriaId}"; var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync>() : null; } public async Task GetResultadosAsync(string authToken, string distritoId, string seccionId, string? municipioId, int categoriaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); // Construimos la URL base var requestUri = $"/api/resultados/getResultados?distritoId={distritoId}&seccionId={seccionId}&categoriaId={categoriaId}"; // Añadimos el municipioId a la URL SÓLO si no es nulo o vacío if (!string.IsNullOrEmpty(municipioId)) { requestUri += $"&municipioId={municipioId}"; } var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task GetBancasAsync(string authToken, string distritoId, string? seccionProvincialId, int categoriaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var requestUri = $"/api/resultados/getBancas?distritoId={distritoId}&categoriaId={categoriaId}"; // Añadimos el seccionProvincialId a la URL SÓLO si tiene un valor. if (!string.IsNullOrEmpty(seccionProvincialId)) { requestUri += $"&seccionProvincialId={seccionProvincialId}"; } var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId, int? categoriaId = null) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var requestUri = $"/api/resultados/getTelegramasTotalizados?distritoId={distritoId}&seccionId={seccionId}"; if (categoriaId.HasValue) { requestUri += $"&categoriaId={categoriaId.Value}"; } var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); // Ahora deserializamos al tipo correcto: List return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync>() : null; } public async Task GetTelegramaFileAsync(string authToken, string mesaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var requestUri = $"/api/resultados/getFile?mesaId={mesaId}"; var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task GetResumenAsync(string authToken, string distritoId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var requestUri = $"/api/resultados/getResumen?distritoId={distritoId}"; var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task GetEstadoRecuentoGeneralAsync(string authToken, string distritoId, int categoriaId) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); // La URL ahora usa el parámetro 'categoriaId' que se recibe var requestUri = $"/api/estados/estadoRecuento?distritoId={distritoId}&categoriaId={categoriaId}"; var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync() : null; } public async Task?> GetCategoriasAsync(string authToken) { var client = _httpClientFactory.CreateClient("ElectoralApiClient"); var request = new HttpRequestMessage(HttpMethod.Get, "/api/catalogo/getCategorias"); request.Headers.Add("Authorization", $"Bearer {authToken}"); var response = await client.SendAsync(request); return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync>() : null; } }