using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using EFC_GO;

namespace EFCore_Kontext
{
 public class WWWingsContext : Microsoft.EntityFrameworkCore.DbContext
 {

  private static long InstanceCount = 0;
  public long ID { get; set; }
  public virtual DbSet<Flug> Flug { get; set; }
  public virtual DbSet<FlugPassagier> FlugPassagier { get; set; }
  public virtual DbSet<Mitarbeiter> Mitarbeiter { get; set; }
  public virtual DbSet<Passagier> Passagier { get; set; }
  public virtual DbSet<Person> Person { get; set; }
  public virtual DbSet<Pilot> Pilot { get; set; }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  { // Provider und Connection String festlegen
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
   optionsBuilder.UseSqlServer(@"Server=.;Database=WWWings66_vieleDaten;Trusted_Connection=True;MultipleActiveResultSets=True;");
  }
  public WWWingsContext()
  {
   this.ID = ++WWWingsContext.InstanceCount;
  }
  public WWWingsContext(DbContextOptions<WWWingsContext> options) : base(options)
  {
   this.ID = ++WWWingsContext.InstanceCount;
  }
  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {

   //modelBuilder.Entity<Flug>().HasKey(e => e.FlugNr);

   modelBuilder.Entity<Flug>(entity =>
   { // Entität konfigurieren
    entity.HasKey(e => e.FlugNr).HasName("PK_Flug");
    entity.HasIndex(e => e.Guid).IsUnique();
    entity.Ignore(e => e.Guid); // nur zum TEST
    entity.ToTable("Flug", "Betrieb");

    entity.HasIndex(e => new { e.Abflugort, e.Zielort, e.Datum })
        .HasName("Abflugort");

    entity.Property(e => e.FlugNr).ValueGeneratedNever();

    entity.Property(e => e.Abflugort)
        .IsRequired()
        .HasColumnType("varchar(50)")
        .HasDefaultValueSql("'(offen)'");

    entity.Property(e => e.Ankunft).HasColumnType("datetime");

    entity.Property(e => e.Datum).HasColumnType("datetime");

    entity.Property(e => e.Memo).HasColumnType("varchar(max)");

    entity.Property(e => e.PilotPersonId).HasColumnName("Pilot_PersonID");

    entity.Property(e => e.Timestamp)
        .HasColumnType("timestamp")
        .ValueGeneratedOnAddOrUpdate();

    entity.Property(e => e.Zielort)
        .IsRequired()
        .HasColumnType("varchar(50)");

    entity.HasOne(d => d.PilotPerson)
        .WithMany(p => p.Flug)
        .HasForeignKey(d => d.PilotPersonId)
        .HasConstraintName("FK_FL_Flug_PI_Pilot");
   });

   modelBuilder.Entity<FlugPassagier>(entity =>
   {
    entity.HasKey(e => new { e.FlugFlugNr, e.PassagierPersonId })
        .HasName("PK_Flug_Passagier");

    entity.ToTable("Flug_Passagier", "Betrieb");

    entity.Property(e => e.FlugFlugNr).HasColumnName("Flug_FlugNr");

    entity.Property(e => e.PassagierPersonId).HasColumnName("Passagier_PersonID");

    entity.HasOne(d => d.FlugFlugNrNavigation)
        .WithMany(p => p.FlugPassagier)
        .HasForeignKey(d => d.FlugFlugNr)
        .OnDelete(DeleteBehavior.Restrict)
        .HasConstraintName("FK_Flug_Passagier_Flug");

    entity.HasOne(d => d.PassagierPerson)
        .WithMany(p => p.FlugPassagier)
        .HasForeignKey(d => d.PassagierPersonId)
        .OnDelete(DeleteBehavior.Restrict)
        .HasConstraintName("FK_Flug_Passagier_Passagier");
   });

   modelBuilder.Entity<Mitarbeiter>(entity =>
   {
    entity.HasKey(e => e.PersonId)
        .HasName("PK_Mitarbeiter");

    entity.ToTable("Mitarbeiter", "Betrieb");

    entity.Property(e => e.PersonId)
        .HasColumnName("PersonID")
        .ValueGeneratedNever();

    entity.Property(e => e.Einstellungsdatum).HasColumnType("datetime");

    entity.Property(e => e.VorgesetzterPersonId).HasColumnName("VorgesetzterPersonID");

    entity.HasOne(d => d.Person)
        .WithOne(p => p.Mitarbeiter)
        .HasForeignKey<Mitarbeiter>(d => d.PersonId)
        .OnDelete(DeleteBehavior.Restrict)
        .HasConstraintName("FK_MI_Mitarbeiter_PE_Person");

    entity.HasOne(d => d.VorgesetzterPerson)
        .WithMany(p => p.InverseVorgesetzterPerson)
        .HasForeignKey(d => d.VorgesetzterPersonId)
        .HasConstraintName("FK_Mitarbeiter_Mitarbeiter");
   });

   modelBuilder.Entity<Passagier>(entity =>
   {
    entity.HasKey(e => e.PersonId)
        .HasName("PK_Passagier");

    entity.ToTable("Passagier", "Betrieb");

    entity.Property(e => e.PersonId)
        .HasColumnName("PersonID")
        .ValueGeneratedNever();

    entity.Property(e => e.KundeSeit).HasColumnType("datetime");

    entity.Property(e => e.KundenStatus).HasColumnType("nchar(1)");

    entity.HasOne(d => d.Person)
        .WithOne(p => p.Passagier)
        .HasForeignKey<Passagier>(d => d.PersonId)
        .OnDelete(DeleteBehavior.Restrict)
        .HasConstraintName("FK_PS_Passagier_PE_Person");
   });

   modelBuilder.Entity<Person>(entity =>
   {
    entity.ToTable("Person", "Betrieb");

    entity.Property(e => e.PersonId)
        .HasColumnName("PersonID")
        .ValueGeneratedNever();

    entity.Property(e => e.Email)
        .HasColumnName("EMail")
        .HasMaxLength(50);

    entity.Property(e => e.Geburtsort).HasMaxLength(30);

    entity.Property(e => e.Geburtstag).HasColumnType("datetime");

    entity.Property(e => e.Land).HasMaxLength(2);

    entity.Property(e => e.Memo).HasColumnType("varchar(max)");

    entity.Property(e => e.Name)
        .IsRequired()
        .HasMaxLength(50);

    entity.Property(e => e.Stadt).HasMaxLength(30);

    entity.Property(e => e.Vorname)
        .IsRequired()
        .HasMaxLength(50);
   });

   modelBuilder.Entity<Pilot>(entity =>
   {
    entity.HasKey(e => e.PersonId)
        .HasName("PK_Pilot");

    entity.ToTable("Pilot", "Betrieb");

    entity.Property(e => e.PersonId)
        .HasColumnName("PersonID")
        .ValueGeneratedNever();

    entity.Property(e => e.FlugscheinSeit).HasColumnType("datetime");

    entity.Property(e => e.Flugscheintyp).HasColumnType("nchar(1)");

    entity.Property(e => e.Flugschule).HasMaxLength(50);

    entity.HasOne(d => d.Person)
        .WithOne(p => p.Pilot)
        .HasForeignKey<Pilot>(d => d.PersonId)
        .OnDelete(DeleteBehavior.Restrict)
        .HasConstraintName("FK_PI_Pilot_MI_Mitarbeiter");
   });
  }

 }
}