using LambertzPortal.Models;
using Microsoft.EntityFrameworkCore;

namespace LambertzPortal.Data
{
    public class LambertzDbContext : DbContext
    {
        public LambertzDbContext(DbContextOptions<LambertzDbContext> options)
            : base(options)
        {
        }

        public DbSet<BlazorUser> BlazorUser => Set<BlazorUser>();
        public DbSet<BlazorBerechtigung> BlazorBerechtigung => Set<BlazorBerechtigung>();
        public DbSet<BlazorUserBerechtigung> BlazorUserBerechtigung => Set<BlazorUserBerechtigung>();

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Tabellen & Schema
            modelBuilder.Entity<BlazorUser>()
                .ToTable("BlazorUser", "LA");

            modelBuilder.Entity<BlazorBerechtigung>()
                .ToTable("BlazorBerechtigung", "LA");

            modelBuilder.Entity<BlazorUserBerechtigung>()
                .ToTable("BlazorUserBerechtigung", "LA");

            // Benutzername eindeutig
            modelBuilder.Entity<BlazorUser>()
                .HasIndex(x => x.Benutzername)
                .IsUnique();

            // Zusammengesetzter Primärschlüssel
            modelBuilder.Entity<BlazorUserBerechtigung>()
                .HasKey(x => new { x.BenutzerId, x.BerechtigungId });

            // Relation: User → UserBerechtigungen
            modelBuilder.Entity<BlazorUserBerechtigung>()
                .HasOne(x => x.Benutzer)
                .WithMany(x => x.BenutzerBerechtigungen)
                .HasForeignKey(x => x.BenutzerId)
                .OnDelete(DeleteBehavior.Cascade);

            // Relation: Berechtigung → UserBerechtigungen
            modelBuilder.Entity<BlazorUserBerechtigung>()
                .HasOne(x => x.Berechtigung)
                .WithMany(x => x.BenutzerBerechtigungen)
                .HasForeignKey(x => x.BerechtigungId)
                .OnDelete(DeleteBehavior.Cascade);

            base.OnModelCreating(modelBuilder);
        }
    }
}
