using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudApp.Services
{
    /// <summary>
    /// сервис скважин
    /// </summary>
    public interface IWellService : ICrudRepository<WellDto>
    {
        /// <summary>
        /// сервис телеметрии
        /// </summary>
        ITelemetryService TelemetryService { get; }

        /// <summary>
        /// Список скважин доступных компании
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<WellDto>> GetAsync(WellRequest request, CancellationToken token);

        /// <summary>
        /// Статистика по скважине
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<WellMapInfoWithTelemetryStat?> GetOrDefaultStatAsync(int idWell, CancellationToken token);

        /// <summary>
        /// проверяет доступ к скважине для компании
        /// </summary>
        /// <param name="idCompany"></param>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<bool> IsCompanyInvolvedInWellAsync(int idCompany, int idWell, CancellationToken token);

        //TODO: remove that
        /// <summary>
        /// получить название скважины по id
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<string> GetWellCaptionByIdAsync(int idWell, CancellationToken token);

        /// <summary>
        /// список компаний участвующих в скважине
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<CompanyDto>> GetCompaniesAsync(int idWell, CancellationToken token);

        //TODO: remove that
        /// <summary>
        /// 
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        string GetStateText(int state);

        /// <summary>
        /// дата получения последних данных от панели
        /// </summary>
        /// <param name="idWell"></param>
        /// <returns></returns>
        DateTime GetLastTelemetryDate(int idWell);

        //TODO: выяснить и удалить отсюда
        /// <summary>
        /// получение списка скважин куста в котором находится указанная скважина
        /// </summary>
        /// <param name="idWell"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<int>> GetClusterWellsIdsAsync(int idWell, CancellationToken token);

        /// <summary>
        /// часовой пояс скважины
        /// </summary>
        /// <param name="idWell"></param>
        /// <returns></returns>
        SimpleTimezoneDto GetTimezone(int idWell);

        /// <summary>
        /// диапазон дат с данными телеметрии
        /// </summary>
        /// <param name="idWell"></param>
        /// <returns></returns>
        DatesRangeDto GetDatesRange(int idWell);

        /// <summary>
        /// ВРЕМЕННЫЙ метод
        /// </summary>
        /// <param name="idCompany"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<DepositBranchDto>> GetWellTreeAsync(int idCompany, CancellationToken token);
    }
}