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

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

			// 2. 设置复合主键
			// ClassId 和 StudentId 的组合作为主键，确保一个班级中一个学生只有一条入学记录。
			builder.HasKey(cs => new { cs.ClassId, cs.StudentId });

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

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

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

			// 配置 EnrollmentDate 属性对应的数据库列名为 "enrollment_date"，并设置为必需字段。
			builder.Property(cs => cs.EnrollmentDate)
				.HasColumnName("enrollment_date")
				.IsRequired();

			// 配置 IsDeleted 属性对应的数据库列名为 "deleted"，并设置默认值为 false。
			builder.Property(cs => cs.IsDeleted)
				.HasColumnName("deleted")
				.HasDefaultValue(false); // 常用作软删除标记

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

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

			// ---
			// 配置 ClassStudent 到 User (Student) 的关系 (多对一)
			// 一个 ClassStudent 联结记录属于一个 User (作为 Student)。
			//
			// 假设 `User` 实体中有一个名为 `EnrolledClassesLink` 的 `ICollection<ClassStudent>` 集合属性，
			// 用于表示该用户所注册的班级联结记录 (与 `ClassTeacherConfiguration` 中的模式类似)。
			builder.HasOne(cs => cs.Student)          // 当前 ClassStudent 链接到一个 User (学生)
				.WithMany(u => u.EnrolledClassesLink) // 那个 User (学生) 可以有多个 ClassStudent 记录
				.HasForeignKey(cs => cs.StudentId)    // 外键是 ClassStudent.StudentId
				.OnDelete(DeleteBehavior.Restrict);   // 当 User (学生) 被删除时，如果还有相关的 ClassStudent 记录，则会阻止删除。
													  // 这是更安全的做法，以避免意外数据丢失。如果你希望学生被删除时，其所有注册关系也一并删除，可改为 DeleteBehavior.Cascade。
		}
	}
}
