using Entities.Contracts;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore;

namespace TechHelper.Context.Configuration
{
	public class ClassTeacherConfiguration : IEntityTypeConfiguration<ClassTeacher>
	{
		public void Configure(EntityTypeBuilder<ClassTeacher> builder)
		{
			// 1. 设置表名
			// 将此实体映射到数据库中名为 "class_teachers" 的表。
			builder.ToTable("class_teachers");

			// 2. 设置复合主键
			// ClassId 和 TeacherId 的组合作为主键，确保一个班级中一个老师只有一条任教记录。
			// 这要求 ClassTeacher 类中的 ClassId 和 TeacherId 属性上都添加了 [Key] 特性。
			builder.HasKey(ct => new { ct.ClassId, ct.TeacherId });

			// 3. 配置列名和属性特性

			// 配置 ClassId 属性对应的数据库列名为 "class_id"。
			builder.Property(ct => ct.ClassId)
				.HasColumnName("class_id");

			// 配置 TeacherId 属性对应的数据库列名为 "teacher_id"。
			builder.Property(ct => ct.TeacherId)
				.HasColumnName("teacher_id");

			// 配置 SubjectTaught 属性对应的数据库列名为 "subject_taught"。
			// 假设 SubjectTaught 可以为空，所以没有 .IsRequired()
			builder.Property(ct => ct.SubjectTaught)
				.HasColumnName("subject_taught");

			// 4. 配置导航属性和外键关系

			// ---
			// 配置 ClassTeacher 到 Class 的关系 (多对一)
			// 一个 ClassTeacher 联结记录属于一个 Class。
			//
			// 假设 `Class` 实体中有一个名为 `ClassTeachers` 的 `ICollection<ClassTeacher>` 集合属性。
			builder.HasOne(ct => ct.Class)            // 当前 ClassTeacher 链接到一个 Class
				.WithMany(c => c.ClassTeachers)       // 那个 Class 可以有多个 ClassTeacher 记录
				.HasForeignKey(ct => ct.ClassId)      // 外键是 ClassTeacher.ClassId
				.OnDelete(DeleteBehavior.Cascade);    // 当 Class 被删除时，相关的 ClassTeacher 记录也级联删除。

			// ---
			// 配置 ClassTeacher 到 User (Teacher) 的关系 (多对一)
			// 一个 ClassTeacher 联结记录属于一个 User (作为 Teacher)。
			//
			// 假设 `User` 实体中有一个名为 `TaughtClassesLink` 的 `ICollection<ClassTeacher>` 集合属性，
			// 用于表示该用户所教授的班级联结记录。
			builder.HasOne(ct => ct.Teacher)          // 当前 ClassTeacher 链接到一个 User (老师)
				.WithMany(u => u.TaughtClassesLink)   // 那个 User (老师) 可以有多个 ClassTeacher 记录 (为所教授的班级)
				.HasForeignKey(ct => ct.TeacherId)    // 外键是 ClassTeacher.TeacherId
				.OnDelete(DeleteBehavior.Cascade);   // 当 User (老师) 被删除时，如果还有相关的 ClassTeacher 记录，则会阻止删除。
													  // 这通常是防止数据丢失的更安全选择。如果你希望老师被删除时，其所有任教关系也一并删除，可改为 DeleteBehavior.Cascade。
		}
	}
	
}
