using AsbCloudDb.Model.GTR;
using AsbCloudDb.Model.Subsystems;
using AsbCloudDb.Model.WITS;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudDb.Model.Manuals;
using AsbCloudDb.Model.ProcessMaps;

namespace AsbCloudDb.Model
{
    public interface IAsbCloudDbContext : IDisposable
    {
        DbSet<Cluster> Clusters { get; }
        DbSet<Company> Companies { get; }
        DbSet<CompanyType> CompaniesTypes { get; }
        DbSet<DailyReport.DailyReport> DailyReports { get; }
        DbSet<Deposit> Deposits { get; }
        DbSet<DetectedOperation> DetectedOperations { get; }
        DbSet<PlannedTrajectory> PlannedTrajectories { get; }
        DbSet<ProcessMapWellDrilling> ProcessMapWellDrillings { get; }
        DbSet<ProcessMapWellReam> ProcessMapWellReams { get; }
        DbSet<DrillingProgramPart> DrillingProgramParts { 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<RelationUserRoleUserRole> RelationUserRoleUserRoles { get; }
        DbSet<RelationContactWell> RelationContactsWells { get; }
        DbSet<ReportProperty> ReportProperties { get; }
        DbSet<Subsystem> Subsystems { get; }
        DbSet<SubsystemOperationTime> SubsystemOperationTimes { 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<WitsItemFloat> WitsItemFloat { get; }
        DbSet<WitsItemInt> WitsItemInt { get; }
        DbSet<WitsItemString> WitsItemString { get; }
        DbSet<Driller> Drillers { get; }
        DbSet<Schedule> Schedule { get; }
        DbSet<OperationValue> OperationValues { get; }
        DbSet<WellFinalDocument> WellFinalDocuments { get; }
        DbSet<LimitingParameter> LimitingParameter { get; }
        DbSet<TelemetryWirelineRunOut> TelemetryWirelineRunOut { get; }
        DbSet<Faq> Faqs { 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; }
        DbSet<HelpPage> HelpPages { get; }
        DbSet<Notification> Notifications { get; }
        DbSet<NotificationCategory> NotificationCategories { get; }
        DbSet<Manual> Manuals { get; }
        DbSet<ManualDirectory> ManualDirectories { get; }
        DbSet<Contact> Contacts { get; }
        DbSet<DrillTest> DrillTests { get; }
        DatabaseFacade Database { get; }

        Task<int> RefreshMaterializedViewAsync(string mwName, CancellationToken token);
        Task<int> RefreshMaterializedViewAsync<TEntity>(CancellationToken token) where TEntity : class;
        int SaveChanges();
        int SaveChanges(bool acceptAllChangesOnSuccess);
        Task<int> SaveChangesAsync(CancellationToken cancellationToken);
        DbSet<TEntity> Set<TEntity>() where TEntity : class;

        EntityEntry<TEntity> Entry<TEntity>(TEntity entity)
            where TEntity : class;
    }
}