using GestionaDenuncias.Shared.Models;

namespace GestionaDenunciasAN.Services;

public sealed class ApiDenunciaStore : IDenunciaStore
{
    private readonly ApiDenunciasClient _api;

    public ApiDenunciaStore(ApiDenunciasClient api)
    {
        _api = api;
    }

    public Task EnsureSchemaAsync(CancellationToken cancellationToken = default)
        => _api.PostAsync("api/denuncias/schema/ensure", body: null, cancellationToken);

    public async Task<List<DenunciasGestiona>> GetAllDenunciasAsync(CancellationToken cancellationToken = default)
        => await GetDenunciasByScopeAsync(DenunciaListScope.All, cancellationToken);

    public async Task<List<DenunciasGestiona>> GetDenunciasByScopeAsync(
        DenunciaListScope scope,
        CancellationToken cancellationToken = default)
    {
        var path = scope == DenunciaListScope.All
            ? "api/denuncias"
            : $"api/denuncias?scope={Uri.EscapeDataString(scope.ToString())}";

        return (await _api.GetAsync<List<DenunciasGestiona>>(path, cancellationToken)) ?? [];
    }

    public async Task<List<FicherosDenuncias>> GetAllFicherosAsync(CancellationToken cancellationToken = default)
        => (await _api.GetAsync<List<FicherosDenuncias>>("api/denuncias/ficheros", cancellationToken)) ?? [];

    public async Task<List<FicherosDenuncias>> GetFicherosByDenunciaAsync(int denunciaId, CancellationToken cancellationToken = default)
        => (await _api.GetAsync<List<FicherosDenuncias>>($"api/denuncias/{denunciaId}/ficheros", cancellationToken)) ?? [];

    public async Task<List<GestionaUploadHistoryEntry>> GetGestionaUploadHistoryAsync(CancellationToken cancellationToken = default)
        => (await _api.GetAsync<List<GestionaUploadHistoryEntry>>("api/denuncias/gestiona-history", cancellationToken)) ?? [];

    public Task<DenunciasGestiona?> GetDenunciaByIdAsync(int denunciaId, CancellationToken cancellationToken = default)
        => _api.GetAsync<DenunciasGestiona?>($"api/denuncias/{denunciaId}", cancellationToken);

    public Task UpsertDenunciaAsync(DenunciasGestiona denuncia, CancellationToken cancellationToken = default)
        => _api.PostAsync("api/denuncias", denuncia, cancellationToken);

    public Task UpsertFicherosAsync(IEnumerable<FicherosDenuncias> ficheros, CancellationToken cancellationToken = default)
        => _api.PostAsync("api/denuncias/ficheros", new UpsertFicherosRequest(ficheros.ToArray()), cancellationToken);

    public Task AddGestionaUploadHistoryAsync(
        GestionaUploadHistoryCreateRequest request,
        string username,
        CancellationToken cancellationToken = default)
        => _api.PostAsync("api/denuncias/gestiona-history", request, cancellationToken);

    public Task MarkFicherosAsUploadedAsync(
        int denunciaId,
        IEnumerable<string> fileNames,
        DateTime uploadedAtUtc,
        CancellationToken cancellationToken = default)
        => _api.PostAsync(
            $"api/denuncias/{denunciaId}/ficheros/mark-uploaded",
            new MarkFicherosUploadedRequest(fileNames.ToArray(), uploadedAtUtc),
            cancellationToken);
}
