﻿using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using TimetableWebAPI.Domain.Entities;
using TimetableWebAPI.Infrastructure.Interfaces;

namespace TimetableWebAPI.Infrastructure.Mappings
{
    public class SubjectsMapping : IEntityMapping
    {
        #region Статические свойства

        /// <summary>
        ///     Возвращает дефолтный обьект настроек маппинга Subject
        /// </summary>
        public static SubjectsMapping Default => new SubjectsMapping();

        #endregion

        #region Свойства маппинга

        /// <summary>
        ///     Возвращает название таблицы, которая будет создана для обьекта
        /// </summary>
        public string ObjectTableName { get; set; }

        #endregion

        #region Инициализаторы

        /// <summary>
        ///     Инициализатор настроек маппинга обьекта Subject
        /// </summary>
        public SubjectsMapping()
        {
        }

        #endregion

        #region Маппинг

        /// <summary>
        ///     Маппит обьекты типа Subject на базу данных
        /// </summary>
        /// <param name="modelBuilder"></param>
        public void Map(ModelBuilder modelBuilder)
        {
            //Получаем нужный билдер обьекта
            modelBuilder.Entity<Subject>(entity =>
            {
                //Говорим как назвать таблицу
                if (ObjectTableName != null) entity.ToTable(ObjectTableName, "dbo");

                //Говорим где первичный ключ
                entity.HasKey(subject => subject.ID);

                //Поле Name обязательно
                entity.Property(teacher => teacher.Name)
                    .IsRequired();

                //Настраиваем поле School
                //отношение 1 школа к многим предметам
                entity.HasOne(subject => subject.School)
                    .WithMany(school => school.Subjects)
                    //с внешним ключом
                    .HasForeignKey(subject => subject.SchoolID)
                    //поле обязательно
                    .IsRequired()
                    //при удалении афк
                    .OnDelete(DeleteBehavior.Restrict);
            });
        }

        #endregion
    }
}