using AsbCloudApp.Data;
using AsbCloudApp.Data.ProcessMaps;
using AsbCloudApp.Requests;
using Refit;

namespace AsbCloudWebApi.IntegrationTests.Clients;

public interface IProcessMapPlanDrillingClient<TDto> where TDto : ProcessMapPlanBaseDto
{
    private const string BaseRoute = "/api/well/{idWell}/ProcessMapPlanDrilling";

    [Post(BaseRoute)]
    Task<IApiResponse<int>> InsertRange(int idWell, [Body] IEnumerable<TDto> dtos);

    [Post($"{BaseRoute}/replace")]
    Task<IApiResponse<int>> ClearAndInsertRange(int idWell, [Body] IEnumerable<TDto> dtos);

    [Delete(BaseRoute)]
    Task<IApiResponse<int>> DeleteRange(int idWell, [Body] IEnumerable<int> ids);

    [Delete($"{BaseRoute}/clear")]
    Task<IApiResponse<int>> Clear(int idWell);

    [Get(BaseRoute)]
    Task<IApiResponse<IEnumerable<TDto>>> Get(int idWell);

    [Get($"{BaseRoute}/changelogByMoment")]
    Task<IApiResponse<IEnumerable<ChangeLogDto<TDto>>>> Get(int idWell, DateTimeOffset? moment);

    [Get("/api/telemetry/{uid}/ProcessMapPlanDrilling")]
    Task<IApiResponse<IEnumerable<ChangeLogDto<TDto>>>> Get(string uid, DateTimeOffset? updateFrom);

    [Get($"{BaseRoute}/changeLogForDate")]
    Task<IApiResponse<IEnumerable<TDto>>> GetChangeLog(int idWell, DateOnly? date);

    [Get($"{BaseRoute}/dates")]
    Task<IApiResponse<IEnumerable<DateOnly>>> GetDatesChange(int idWell);

    [Put(BaseRoute)]
    Task<IApiResponse<int>> UpdateOrInsertRange(int idWell, IEnumerable<TDto> dtos);

    [Multipart]
    [Post(BaseRoute + "/parse")]
    Task<IApiResponse<ParserResultDto<TDto>>> Parse(int idWell, [AliasAs("file")] StreamPart stream);
}