using Edge.Core.Database.Configuration.Models;
using Edge.Core.Database.Models;
using Microsoft.EntityFrameworkCore;

namespace Edge.Core.Database
{
    /// <summary>
    /// this type is injected into IServiceProvider by lifetime of Scoped: services.AddScoped<SqliteDbContext>()
    ///     so, retrieve an instance of this DbContext by always create your own scope, and dispose it when done.
    ///     otherwise, a global shared one would be retrieved.
    /// </summary>
    public class SqliteDbContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=liteFccCore_sqlite_database.db");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.Owner })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.Type })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.State })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.CreatedTimeStamp })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.ModifiedTimeStamp })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty0 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty1 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty2 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty3 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty4 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty5 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty6 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty7 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty8 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.IntProperty9 })
                    .IsUnique(false);

            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty0 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty1 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty2 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty3 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty4 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty5 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty6 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty7 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty8 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.DoubleProperty9 })
                    .IsUnique(false);

            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty0 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty1 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty2 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty3 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty4 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty5 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty6 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty7 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty8 })
                    .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                    .HasIndex(p => new { p.StrProperty9 })
                    .IsUnique(false);

            modelBuilder.Entity<GenericData>()
                   .HasIndex(p => new { p.TimeStampProperty0 })
                   .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                   .HasIndex(p => new { p.TimeStampProperty1 })
                   .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                   .HasIndex(p => new { p.TimeStampProperty2 })
                   .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                   .HasIndex(p => new { p.TimeStampProperty3 })
                   .IsUnique(false);
            modelBuilder.Entity<GenericData>()
                   .HasIndex(p => new { p.TimeStampProperty4 })
                   .IsUnique(false);

            modelBuilder.Entity<ProcessorMetaConfigDbModel>()
                   .HasIndex(p => new { p.Name })
                   .IsUnique(true);
            modelBuilder.Entity<ProcessorMetaConfigDbModel>()
                   .HasIndex(p => new { p.TimeStamp })
                   .IsUnique(false);

            modelBuilder.Entity<ProcessorMetaPartsMetaConfigDbModel>()
                   .HasIndex(p => new { p.ProcessorMetaConfigId, p.Type })
                   .IsUnique(true);

            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.Severity })
                   .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                  .HasIndex(p => new { p.HiddenData })
                  .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.Category, p.SubCategory })
                   .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.OpeningTimestamp })
                   .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.ClosedTimestamp })
                   .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.ProcessorEndpointFullTypeStr })
                   .IsUnique(false);
            modelBuilder.Entity<GenericAlarmDbModel>()
                   .HasIndex(p => new { p.OriginatorDisplayName, p.OpeningTimestamp, p.ClosedTimestamp })
                   .IsUnique(false);
        }

        public DbSet<FuelPointReservation> FuelPointReservationModels { get; set; }
        public DbSet<FuelSaleTransaction> PumpTransactionModels { get; set; }

        public DbSet<FuelPriceChange> FuelPriceChanges { get; set; }

        public DbSet<GenericData> GenericDatas { get; set; }
        public DbSet<GenericAlarmDbModel> GenericAlarms { get; set; }

        public DbSet<ProcessorMetaConfigDbModel> ProcessorMetaConfigs { get; set; }
        public DbSet<ProcessorMetaPartsMetaConfigDbModel> ProcessorMetaPartsMetaConfigs { get; set; }
    }
}