using DD.Persistence.Models;
using DD.Persistence.Models.Requests;
using Refit;

namespace DD.Persistence.Client.Clients.Interfaces.Refit;

public interface IRefitChangeLogClient : IDisposable
{
    private const string BaseRoute = "/api/ChangeLog";

    [Post($"{BaseRoute}/replace/{{idDiscriminator}}")]
    Task<IApiResponse<int>> ClearAndAddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);

    [Get($"{BaseRoute}/moment/{{idDiscriminator}}")]
    Task<IApiResponse<PaginationContainer<DataWithWellDepthAndSectionDto>>> GetByDate(
		Guid idDiscriminator,
        DateTimeOffset moment,
        [Query] SectionPartRequest filterRequest,
        [Query] PaginationRequest paginationRequest, 
        CancellationToken token);

    [Get($"{BaseRoute}/history/{{idDiscriminator}}")]
    Task<IApiResponse<IEnumerable<ChangeLogDto>>> GetChangeLogForInterval(Guid idDiscriminator, DateTimeOffset dateBegin, DateTimeOffset dateEnd, CancellationToken token);

    [Post($"{BaseRoute}/{{idDiscriminator}}")]
    Task<IApiResponse<int>> Add(Guid idDiscriminator, DataWithWellDepthAndSectionDto dto, CancellationToken token);

    [Post($"{BaseRoute}/range/{{idDiscriminator}}")]
    Task<IApiResponse<int>> AddRange(Guid idDiscriminator, IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);

    [Put($"{BaseRoute}")]
    Task<IApiResponse<int>> Update(DataWithWellDepthAndSectionDto dto, CancellationToken token);

    [Put($"{BaseRoute}/range")]
    Task<IApiResponse<int>> UpdateRange(IEnumerable<DataWithWellDepthAndSectionDto> dtos, CancellationToken token);

    [Delete($"{BaseRoute}")]
    Task<IApiResponse<int>> Delete(Guid id, CancellationToken token);

    [Delete($"{BaseRoute}/range")]
    Task<IApiResponse<int>> DeleteRange([Body] IEnumerable<Guid> ids, CancellationToken token);

    [Get($"{BaseRoute}/datesRange/{{idDiscriminator}}")]
    Task<IApiResponse<DatesRangeDto?>> GetDatesRange(Guid idDiscriminator, CancellationToken token);

}