using Microsoft.EntityFrameworkCore;
using Persistence.Database.Entity;

namespace Persistence.Database.Model;
public partial class PersistenceDbContext : DbContext
{
    public DbSet<DataSaub> DataSaub => Set<DataSaub>();
    public DbSet<ChangeLog> ChangeLog => Set<ChangeLog>();

    public DbSet<Setpoint> Setpoint => Set<Setpoint>();

    public DbSet<TechMessage> TechMessage => Set<TechMessage>();

    public DbSet<TimestampedSet> TimestampedSets => Set<TimestampedSet>();

    public PersistenceDbContext()
        : base()
    {

    }

    public PersistenceDbContext(DbContextOptions<PersistenceDbContext> options)
        : base(options)
    {

    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
            optionsBuilder.UseNpgsql("Host=localhost;Database=persistence;Username=postgres;Password=q;Persist Security Info=True;Include Error Detail=True;"
                //, builder=>builder.EnableRetryOnFailure(2, System.TimeSpan.FromMinutes(1))
                );
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasPostgresExtension("adminpack")
            .HasAnnotation("Relational:Collation", "Russian_Russia.1251");

        modelBuilder.Entity<TimestampedSet>()
            .Property(e => e.Set)
            .HasJsonConversion();

        modelBuilder.Entity<TechMessage>(entity =>
        {
            entity.HasOne(t => t.System)
                .WithMany()
                .HasForeignKey(t => t.SystemId)
                .OnDelete(DeleteBehavior.Cascade)
                .IsRequired();
        });

        modelBuilder.Entity<ChangeLog>()
           .Property(e => e.Value)
           .HasJsonConversion();
    }
}