using DbFirst.BlazorWebApp.Models;
using DbFirst.Contracts.Catalogs;

namespace DbFirst.BlazorWebApp.Services;

public class CatalogApiClient : ICatalogApiClient
{
    private readonly HttpClient _httpClient;
    private const string Endpoint = "api/catalogs";

    public CatalogApiClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task<List<CatalogReadDto>> GetAllAsync(CancellationToken ct = default)
    {
        var result = await _httpClient.GetFromJsonAsync<List<CatalogReadDto>>(Endpoint, ct);
        return result ?? [];
    }

    public async Task<CatalogReadDto?> GetByIdAsync(int id, CancellationToken ct = default)
    {
        return await _httpClient.GetFromJsonAsync<CatalogReadDto>($"{Endpoint}/{id}", ct);
    }

    public async Task<ApiResult<CatalogReadDto?>> CreateAsync(CatalogWriteDto dto, CancellationToken ct = default)
    {
        var response = await _httpClient.PostAsJsonAsync(Endpoint, dto, ct);
        if (response.IsSuccessStatusCode)
        {
            var payload = await response.Content.ReadFromJsonAsync<CatalogReadDto>();
            return ApiResult<CatalogReadDto?>.Ok(payload);
        }

        var error = await ApiClientHelper.ReadErrorAsync(response);
        return ApiResult<CatalogReadDto?>.Fail(error);
    }

    public async Task<ApiResult<bool>> UpdateAsync(int id, CatalogWriteDto dto, CancellationToken ct = default)
    {
        var response = await _httpClient.PutAsJsonAsync($"{Endpoint}/{id}", dto, ct);
        if (response.IsSuccessStatusCode)
        {
            return ApiResult<bool>.Ok(true);
        }

        var error = await ApiClientHelper.ReadErrorAsync(response);
        return ApiResult<bool>.Fail(error);
    }

    public async Task<ApiResult<bool>> DeleteAsync(int id, CancellationToken ct = default)
    {
        var response = await _httpClient.DeleteAsync($"{Endpoint}/{id}", ct);
        if (response.IsSuccessStatusCode)
        {
            return ApiResult<bool>.Ok(true);
        }

        var error = await ApiClientHelper.ReadErrorAsync(response);
        return ApiResult<bool>.Fail(error);
    }
}