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

namespace TaskTrackerDatabaseImplement;

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

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

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

    public virtual DbSet<Employee> Employees { get; set; }

    public virtual DbSet<Project> Projects { get; set; }

    public virtual DbSet<Task> Tasks { get; set; }

    public virtual DbSet<TaskAssigment> TaskAssigments { 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=tasktracker;Username=postgres;Password=******");

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

            entity.ToTable("company", tb => tb.HasComment("Сущность \"Компания\""));

            entity.Property(e => e.Id)
                .HasComment("Идентификатор сущности \"Компания\"")
                .UseIdentityAlwaysColumn()
                .HasColumnName("id");
            entity.Property(e => e.Login)
                .HasColumnType("character varying")
                .HasColumnName("login");
            entity.Property(e => e.Name)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Моя компания'::character varying")
                .HasComment("Название компании")
                .HasColumnName("name");
            entity.Property(e => e.Password)
                .HasColumnType("character varying")
                .HasColumnName("password");
        });

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

            entity.ToTable("employee", tb => tb.HasComment("Сущность \"Сотрудник\""));

            entity.Property(e => e.Id)
                .HasComment("Идентификатор сущности \"Сотрудник\"")
                .UseIdentityAlwaysColumn()
                .HasColumnName("id");
            entity.Property(e => e.CompanyId)
                .HasComment("Ссылка на идентификатор компании в которой работает сотрудник")
                .HasColumnName("company_id");
            entity.Property(e => e.Email)
                .HasMaxLength(50)
                .HasDefaultValueSql("'email сотрудника'::character varying")
                .HasComment("E-mail сотрудника")
                .HasColumnName("email");
            entity.Property(e => e.JobTitle)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Должность'::character varying")
                .HasComment("Должность сотрудника")
                .HasColumnName("job_title");
            entity.Property(e => e.Name)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Сотрудник'::character varying")
                .HasComment("ФИО сотрудника")
                .HasColumnName("name");

            entity.HasOne(d => d.Company).WithMany(p => p.Employees)
                .HasForeignKey(d => d.CompanyId)
                .OnDelete(DeleteBehavior.SetNull)
                .HasConstraintName("employee_company_id_fkey");
        });

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

            entity.ToTable("project", tb => tb.HasComment("Сущность \"Проект\""));

            entity.Property(e => e.Id)
                .HasComment("Идентификатор сущности \"Проект\"")
                .UseIdentityAlwaysColumn()
                .HasColumnName("id");
            entity.Property(e => e.CompanyId)
                .HasComment("Ссылка на компанию, делающая проект")
                .HasColumnName("company_id");
            entity.Property(e => e.Name)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Проект'::character varying")
                .HasComment("Название проекта")
                .HasColumnName("name");
            entity.Property(e => e.State)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Создан'::character varying")
                .HasComment("Статус проекта")
                .HasColumnName("state");

            entity.HasOne(d => d.Company).WithMany(p => p.Projects)
                .HasForeignKey(d => d.CompanyId)
                .HasConstraintName("project_company_id_fkey");
        });

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

            entity.ToTable("task", tb => tb.HasComment("Сущность \"Задача\""));

            entity.Property(e => e.Id)
                .HasComment("Идентификатор сущности \"Задача\"")
                .UseIdentityAlwaysColumn()
                .HasColumnName("id");
            entity.Property(e => e.Deadline)
                .HasDefaultValueSql("(CURRENT_DATE + '7 days'::interval)")
                .HasComment("Дедлайн")
                .HasColumnType("timestamp without time zone")
                .HasColumnName("deadline");
            entity.Property(e => e.EndDate)
                .HasComment("Дата выполнения задачи")
                .HasColumnType("timestamp without time zone")
                .HasColumnName("end_date");
            entity.Property(e => e.Name)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Задача'::character varying")
                .HasComment("Название задачи")
                .HasColumnName("name");
            entity.Property(e => e.ProjectId)
                .HasComment("Ссылка на проект задачи")
                .HasColumnName("project_id");
            entity.Property(e => e.StartDate)
                .HasDefaultValueSql("CURRENT_DATE")
                .HasComment("Дата создания задачи")
                .HasColumnType("timestamp without time zone")
                .HasColumnName("start_date");
            entity.Property(e => e.State)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Задача созадна'::character varying")
                .HasComment("Статус задачи")
                .HasColumnName("state");

            entity.HasOne(d => d.Project).WithMany(p => p.Tasks)
                .HasForeignKey(d => d.ProjectId)
                .HasConstraintName("task_project_id_fkey");
        });

        modelBuilder.Entity<TaskAssigment>(entity =>
        {
            entity.HasKey(e => new { e.EmployeeId, e.TaskId }).HasName("pk_employee_task");

            entity.ToTable("task_assigment", tb => tb.HasComment("Сущность \"Назначение на задачу\""));

            entity.Property(e => e.EmployeeId)
                .HasComment("Ссылка на сотрудника")
                .HasColumnName("employee_id");
            entity.Property(e => e.TaskId)
                .HasComment("Ссылка на задачу")
                .HasColumnName("task_id");
            entity.Property(e => e.Role)
                .HasMaxLength(50)
                .HasDefaultValueSql("'Роль'::character varying")
                .HasComment("Роль в задаче")
                .HasColumnName("role");

            entity.HasOne(d => d.Employee).WithMany(p => p.TaskAssigments)
                .HasForeignKey(d => d.EmployeeId).IsRequired()
                .HasConstraintName("employee_task_employee_id_fkey");

            entity.HasOne(d => d.Task).WithMany(p => p.TaskAssigments)
                .HasForeignKey(d => d.TaskId).IsRequired()
                .HasConstraintName("employee_task_task_id_fkey");
        });
        modelBuilder.HasSequence<int>("company_id_seq");

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}