using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudDb.Model
{
    public interface IAsbCloudDbContext
    {
        DbSet<Cluster> Clusters { get; set; }
        DbSet<Company> Companies { get; set; }
        DbSet<DataSaubBase> DataSaubBases { get; set; }
        DbSet<Deposit> Deposits { get; set; }
        DbSet<TelemetryEvent> TelemetryEvents { get; set; }
        DbSet<TelemetryMessage> TelemetryMessages { get; set; }
        DbSet<User> Users { get; set; }
        DbSet<UserRole> UserRoles { get; set; }
        DbSet<ReportProperties> ReportProperties { get; set; }
        DbSet<File> Files { get; set; }
        DbSet<FileCategory> FileCategories { get; set; }
        DbSet<Telemetry> Telemetries { get; set; }
        DbSet<TelemetryUser> TelemetryUsers { get; set; }
        DbSet<Operation> TelemetryOperations { get; set; }
        DbSet<TelemetryAnalysis> TelemetryAnalysis { get; set; }
        DbSet<Well> Wells { get; set; }
        DbSet<WellSection> WellSections { get; set; }
        DbSet<WellSectionType> WellSectionTypes { get; set; }
        DbSet<WellOperation> WellOperations { get; set; }
        DbSet<WellType> WellTypes { get; set; }
        DbSet<LastData> LastData { get; set; }
        DbSet<TvdData> TvdData { get; set; }

        int SaveChanges();
        int SaveChanges(bool acceptAllChangesOnSuccess);
        Task<int> SaveChangesAsync(CancellationToken cancellationToken);

        DbSet<TEntity> Set<TEntity>(string name) where TEntity : class;

        DbSet<TEntity> Set<TEntity>() where TEntity : class;

        IQueryable<Well> GetWellsForCompany(int idCompany);
        IQueryable<User> GetUsersByLogin(string login);
        Task<(DateTime From, DateTime To)> GetDatesRangeAsync<T>(int idTelemetry, CancellationToken token) where T : class, IIdTelemetryDate;
        Task<IEnumerable<(double? MinDepth, double? MaxDepth, DateTime BeginPeriodDate)>> GetDepthToIntervalAsync(int telemetryId,
            int intervalHoursTimestamp, int workStartTimestamp, double timezoneOffset, CancellationToken token);
        Task<int> CreatePartitionAsync<TEntity>(string propertyName, int id, CancellationToken token = default) where TEntity : class;
    }
}