using AsbCloudDb.Model.WITS;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudDb.Model
{
    public interface IAsbCloudDbContext : IDisposable
    {
        DbSet<Cluster> Clusters { get; }
        DbSet<Company> Companies { get; }
        DbSet<DailyReport> DailyReports { get; }
        DbSet<Deposit> Deposits { get; }
        DbSet<DetectedOperation> DetectedOperations { get; }
        DbSet<DrillFlowChart> DrillFlowChart { get; }
        DbSet<DrillingProgramPart> DrillingProgramParts { get; }
        DbSet<DrillParams> DrillParams { get; }
        DbSet<FileCategory> FileCategories { get; }
        DbSet<FileInfo> Files { get; }
        DbSet<FileMark> FileMarks { get; }
        DbSet<Measure> Measures { get; }
        DbSet<MeasureCategory> MeasureCategories { get; }
        DbSet<Permission> Permissions { get; }
        DbSet<RelationCompanyWell> RelationCompaniesWells { get; }
        DbSet<RelationUserDrillingProgramPart> RelationDrillingProgramPartUsers { get; }
        DbSet<RelationUserRolePermission> RelationUserRolePermissions { get; }
        DbSet<RelationUserUserRole> RelationUserUserRoles { get; }
        DbSet<ReportProperty> ReportProperties { get; }
        DbSet<Telemetry> Telemetries { get; }
        DbSet<TelemetryDataSaub> TelemetryDataSaub { get; }
        DbSet<TelemetryDataSaubStat> TelemetryDataSaubStats { get; }
        DbSet<TelemetryDataSpin> TelemetryDataSpin { get; }
        DbSet<TelemetryEvent> TelemetryEvents { get; }
        DbSet<TelemetryMessage> TelemetryMessages { get; }
        DbSet<TelemetryUser> TelemetryUsers { get; }
        DbSet<User> Users { get; }
        DbSet<UserRole> UserRoles { get; }
        DbSet<Well> Wells { get; }
        DbSet<WellComposite> WellComposites { get; }
        DbSet<WellOperation> WellOperations { get; }
        DbSet<WellOperationCategory> WellOperationCategories { get; }
        DbSet<WellSectionType> WellSectionTypes { get; }
        DbSet<WellType> WellTypes { get; }
        DbSet<Driller> Drillers { get; }
        DbSet<Schedule> Schedule { get; }

        DbSet<Record1> Record1 { get; }
        DbSet<Record7> Record7 { get; }
        DbSet<Record8> Record8 { get; }
        DbSet<Record50> Record50 { get; }
        DbSet<Record60> Record60 { get; }
        DbSet<Record61> Record61 { get; }

        DatabaseFacade Database { get; }

        Task<int> RefreshMaterializedViewAsync(string? mwName = null, CancellationToken token = default);
        Task<int> RefreshMaterializedViewAsync<TEntity>(CancellationToken token = default) where TEntity : class;
        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;

    }
}