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

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

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

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

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

        /// <summary>
        /// получить idTelemetry по IdWell
        /// </summary>
        /// <param name="idWell"></param>
        /// <returns></returns>
        TelemetryBaseDto? GetOrDefaultTelemetryByIdWell(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);

        /// <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);
        Task<Stream> GetTelemetriesInfoByLastData(DateTimeOffset from, CancellationToken token);
    }
}