using System.Text;
using System.Text.Json;

namespace HealthcareManagerUI.Services.Http;

public class RequestHttpService : IRequestHttpService
{
    private readonly string _apiKey;

    public RequestHttpService(IConfiguration configuration)
    {
        _apiKey = configuration.GetValue<string>("ApiKey") ?? "NoKey";
    }

    public async Task<T> GetAsync<T>(string uri, IDictionary<string, string> headers = null)
    {
        using var httpClient = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Get, uri);
        AddHeaders(request, headers);

        var response = await httpClient.SendAsync(request);

        var responseContent = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(
            responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
    }

    public async Task<T> GetByIdAsync<T>(string uri, int id, IDictionary<string, string> headers = null)
    {
        return await GetAsync<T>($"{uri}/{id}", headers);
    }

    public async Task<T> PostAsync<T>(string uri, object data, IDictionary<string, string> headers = null)
    {
        using var httpClient = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Post, uri);
        AddHeaders(request, headers);
        request.Content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");

        var response = await httpClient.SendAsync(request);

        var responseContent = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(
            responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
    }

    public async Task<T> PutAsync<T>(string uri, int id, object data, IDictionary<string, string> headers = null)
    {
        using var httpClient = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Put, $"{uri}/{id}");
        AddHeaders(request, headers);
        request.Content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json");

        var response = await httpClient.SendAsync(request);

        var responseContent = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<T>(
            responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
    }

    public async Task DeleteAsync(string uri, int id, IDictionary<string, string> headers = null)
    {
        using var httpClient = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Delete, $"{uri}/{id}");
        AddHeaders(request, headers);

        var response = await httpClient.SendAsync(request);
    }

    private void AddHeaders(HttpRequestMessage request, IDictionary<string, string> headers)
    {
        // Add the API key header to every request
        request.Headers.Add("ApiKey", _apiKey);

        if (headers != null)
        {
            foreach (var header in headers)
            {
                request.Headers.Add(header.Key, header.Value);
            }
        }
    }
}