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

namespace AsbCloudApp.Services
{
    /// <summary>
    /// Сервис телеметрии
    /// </summary>
    public interface ITelemetryService
    {
        /// <summary>
        /// сервис временных зон
        /// </summary>
        ITimezoneService TimeZoneService { get; }

        /// <summary>
        /// трекер запросов
        /// </summary>
        ITelemetryTracker TelemetryTracker { get; }

        /// <summary>
        /// получить idWell по uid телеметрии
        /// </summary>
        /// <param name="uid"></param>
        /// <returns></returns>
        int? GetIdWellByTelemetryUid(string uid);

        /// <summary>
        /// Получить id телеметрии. Если её нет в БД, то добавить новую.
        /// </summary>
        /// <param name="uid"></param>
        /// <returns></returns>
        int GetOrCreateTelemetryIdByUid(string uid);

        /// <summary>
        /// получить временную зону скважины по idTelemetry
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <returns></returns>
        SimpleTimezoneDto GetTimezone(int idTelemetry);

        // TODO: вероятно лишнее
        /// <summary>
        /// Список передающих в данный момент телеметрий
        /// </summary>
        /// <returns></returns>
        IEnumerable<TelemetryDto> GetTransmittingTelemetries();

        // TODO: вероятно лишнее
        /// <summary>
        /// Получить дату получения последних данных
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <param name="useUtc"></param>
        /// <returns></returns>
        DateTime GetLastTelemetryDate(int idTelemetry, bool useUtc = false);

        /// <summary>
        /// получить idTelemetry по IdWell
        /// </summary>
        /// <param name="idWell"></param>
        /// <returns></returns>
        int? GetIdTelemetryByIdWell(int idWell);

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

        /// <summary>
        /// обновить данные о телеметрии (используется панелью)
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="info"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task UpdateInfoAsync(string uid, TelemetryInfoDto info, CancellationToken token);

        // TODO: вероятно лишнее
        /// <summary>
        /// обновить данные о временной зоне (используется панелью)
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="telemetryTimeZoneInfo"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task UpdateTimezoneAsync(string uid, SimpleTimezoneDto telemetryTimeZoneInfo, CancellationToken token);

        /// <summary>
        /// Слить данные телеметрии в одну
        /// </summary>
        /// <param name="from">старая (исходная)</param>
        /// <param name="to">новая</param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> MergeAsync(int from, int to, CancellationToken token);

        // TODO: вероятно лишнее
        /// <summary>
        /// сохранить данные о запросе
        /// </summary>
        /// <param name="uid"></param>
        /// <param name="remoteDate"></param>
        void SaveRequestDate(string uid, DateTimeOffset remoteDate);
    }
}