using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace DataBase;

public partial class LogisticContext : DbContext
{
    public LogisticContext()
    {
    }

    public LogisticContext(DbContextOptions<LogisticContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Car> Cars { get; set; }

    public virtual DbSet<Company> Companies { get; set; }

    public virtual DbSet<Human> Humans { get; set; }

    public virtual DbSet<Place> Places { get; set; }

    public virtual DbSet<Route> Routes { get; set; }

    public virtual DbSet<Status> Statuses { get; set; }

    public virtual DbSet<Voyage> Voyages { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
        => optionsBuilder.UseNpgsql("Host=192.168.56.101;Port=5432;Database=logistic;Username=postgres;Password=postgres");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("car_pkey");

            entity.ToTable("car", tb => tb.HasComment("Таблица машин"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s3'::regclass)")
                .HasComment("Айди машины")
                .HasColumnName("id");
            entity.Property(e => e.Model)
                .HasMaxLength(100)
                .HasDefaultValueSql("'car'::character varying")
                .HasComment("Модель машины")
                .HasColumnName("model");
            entity.Property(e => e.StatusId)
                .HasComment("Статус машины")
                .HasColumnName("status_id");
            entity.Property(e => e.Tonnage)
                .HasComment("Грузоподъемность")
                .HasColumnName("tonnage");

            entity.HasOne(d => d.Status).WithMany(p => p.Cars)
                .HasForeignKey(d => d.StatusId)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("car_status_id_fkey");
        });

        modelBuilder.Entity<Company>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("company_pkey");

            entity.ToTable("company", tb => tb.HasComment("Таблица компаний-заказчиков"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s2'::regclass)")
                .HasComment("Айди компании")
                .HasColumnName("id");
            entity.Property(e => e.StatusId)
                .HasComment("Статус компании")
                .HasColumnName("status_id");
            entity.Property(e => e.Title)
                .HasMaxLength(100)
                .HasDefaultValueSql("'company'::character varying")
                .HasComment("Наимнование компании")
                .HasColumnName("title");

            entity.HasOne(d => d.Status).WithMany(p => p.Companies)
                .HasForeignKey(d => d.StatusId)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("company_status_id_fkey");
        });

        modelBuilder.Entity<Human>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("human_pkey");

            entity.ToTable("human", tb => tb.HasComment("Таблица водителей"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s4'::regclass)")
                .HasComment("Айди человека")
                .HasColumnName("id");
            entity.Property(e => e.Name)
                .HasMaxLength(100)
                .HasDefaultValueSql("'name'::character varying")
                .HasComment("ФИО водителя")
                .HasColumnName("name");
            entity.Property(e => e.Phone)
                .HasMaxLength(12)
                .HasDefaultValueSql("'N'::character varying")
                .HasComment("Телефон водителя")
                .HasColumnName("phone");
            entity.Property(e => e.StatusId)
                .HasComment("Статус водителя")
                .HasColumnName("status_id");

            entity.HasOne(d => d.Status).WithMany(p => p.Humans)
                .HasForeignKey(d => d.StatusId)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("human_status_id_fkey");
        });

        modelBuilder.Entity<Place>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("place_pkey");

            entity.ToTable("place", tb => tb.HasComment("Таблица мест"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s5'::regclass)")
                .HasComment("Айди места")
                .HasColumnName("id");
            entity.Property(e => e.Title)
                .HasMaxLength(100)
                .HasDefaultValueSql("'place'::character varying")
                .HasComment("Наименование места")
                .HasColumnName("title");
        });

        modelBuilder.Entity<Route>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("route_pkey");

            entity.ToTable("route", tb => tb.HasComment("Таблица маршрутов"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s6'::regclass)")
                .HasComment("Айди маршрутта")
                .HasColumnName("id");
            entity.Property(e => e.Length)
                .HasComment("Протяженность маршрута")
                .HasColumnName("length");
            entity.Property(e => e.PlaceEnd)
                .HasComment("Места отправки")
                .HasColumnName("place_end");
            entity.Property(e => e.PlaceStart)
                .HasComment("Места прибытия")
                .HasColumnName("place_start");

            entity.HasOne(d => d.PlaceEndNavigation).WithMany(p => p.RoutePlaceEndNavigations)
                .HasForeignKey(d => d.PlaceEnd)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("route_placeend_fkey");

            entity.HasOne(d => d.PlaceStartNavigation).WithMany(p => p.RoutePlaceStartNavigations)
                .HasForeignKey(d => d.PlaceStart)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("route_placestart_fkey");
        });

        modelBuilder.Entity<Status>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("status_pkey");

            entity.ToTable("status", tb => tb.HasComment("Таблица статусов"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s1'::regclass)")
                .HasComment("Айди статуса")
                .HasColumnName("id");
            entity.Property(e => e.Title)
                .HasMaxLength(20)
                .HasDefaultValueSql("'status'::character varying")
                .HasComment("Название статуса")
                .HasColumnName("title");
        });

        modelBuilder.Entity<Voyage>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("voyage_pkey");

            entity.ToTable("voyage", tb => tb.HasComment("Таблица рейсов"));

            entity.Property(e => e.Id)
                .HasDefaultValueSql("nextval('s7'::regclass)")
                .HasComment("Айди рейса")
                .HasColumnName("id");
            entity.Property(e => e.CarId)
                .HasComment("Машина для рейса")
                .HasColumnName("car_id");
            entity.Property(e => e.CompanyId)
                .HasComment("Компания, заказавшая рейс")
                .HasColumnName("company_id");
            entity.Property(e => e.DateEnd)
                .HasComment("Дедлайн")
                .HasColumnName("date_end");
            entity.Property(e => e.DateStart)
                .HasComment("Дата отправки")
                .HasColumnName("date_start");
            entity.Property(e => e.HumanId)
                .HasComment("Водитель для рейса")
                .HasColumnName("human_id");
            entity.Property(e => e.RouteId)
                .HasComment("Маршрут рейса")
                .HasColumnName("route_id");

            entity.HasOne(d => d.Car).WithMany(p => p.Voyages)
                .HasForeignKey(d => d.CarId)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("voyage_car_id_fkey");

            entity.HasOne(d => d.Company).WithMany(p => p.Voyages)
                .HasForeignKey(d => d.CompanyId)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("voyage_company_id_fkey");

            entity.HasOne(d => d.Human).WithMany(p => p.Voyages)
                .HasForeignKey(d => d.HumanId)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("voyage_human_id_fkey");

            entity.HasOne(d => d.Route).WithMany(p => p.Voyages)
                .HasForeignKey(d => d.RouteId)
                .OnDelete(DeleteBehavior.Restrict)
                .HasConstraintName("voyage_route_id_fkey");
        });
        modelBuilder.HasSequence("s1");
        modelBuilder.HasSequence("s2");
        modelBuilder.HasSequence("s3");
        modelBuilder.HasSequence("s4");
        modelBuilder.HasSequence("s5");
        modelBuilder.HasSequence("s6");
        modelBuilder.HasSequence("s7");

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}