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

namespace TechHelper.Context.Configuration
{
	public class UserConfiguration : IEntityTypeConfiguration<User>
	{
		public void Configure(EntityTypeBuilder<User> builder)
		{
			builder.ToTable("AspNetUsers");

			builder.Property(u => u.RefreshToken)
				.HasColumnName("refresh_token");

			builder.Property(u => u.RefreshTokenExpiryTime)
				.HasColumnName("refresh_token_expiry_time");

			builder.Property(u => u.IsDeleted)
				.HasColumnName("deleted")
				.HasDefaultValue(false); 

			builder.HasMany(u => u.TaughtClassesLink) // 一个 User (老师) 可以教授多个班级
				.WithOne(ct => ct.Teacher)           // 一个 ClassTeacher 记录对应一个 Teacher
				.HasForeignKey(ct => ct.TeacherId)   // 外键在 ClassTeacher.TeacherId
				.OnDelete(DeleteBehavior.Restrict);  // 限制删除：如果老师有任教记录，则不允许删除

			// User 作为学生，与 ClassStudent 的关系 (一对多)
			builder.HasMany(u => u.EnrolledClassesLink) // 一个 User (学生) 可以注册多个班级
				.WithOne(cs => cs.Student)              // 一个 ClassStudent 记录对应一个 Student
				.HasForeignKey(cs => cs.StudentId)      // 外键在 ClassStudent.StudentId
				.OnDelete(DeleteBehavior.Restrict);     // 限制删除：如果学生有注册记录，则不允许删除

			// User 作为创建者，与 Question 的关系 (一对多)
			builder.HasMany(u => u.CreatedQuestions) // 一个 User 可以创建多个题目
				.WithOne(q => q.Creator)             // 一个 Question 对应一个 Creator
				.HasForeignKey(q => q.CreatorId)     // 外键在 Question.CreatedBy
				.OnDelete(DeleteBehavior.Restrict);  // 限制删除：如果创建者有题目，则不允许删除

			// User 作为创建者，与 Assignment 的关系 (一对多)
			builder.HasMany(u => u.CreatedExams) // 一个 User 可以创建多个作业
				.WithOne(a => a.Creator)               // 一个 Assignment 对应一个 Creator
				.HasForeignKey(a => a.CreatorId)       // 外键在 Assignment.CreatedBy
				.OnDelete(DeleteBehavior.Restrict);    // 限制删除：如果创建者有作业，则不允许删除

			builder.HasMany(u => u.SubmissionDetails)   // 一个 User (学生) 可以有多个提交详情记录
				.WithOne(sd => sd.Student)                 // 一个 SubmissionDetail 对应一个 User (学生)
				.HasForeignKey(sd => sd.StudentId)      // 外键在 SubmissionDetail.StudentId
				.OnDelete(DeleteBehavior.Restrict);     // 限制删除：如果学生有提交详情，则不允许删除

			// User 作为学生，与 Submission 的关系 (一对多)
			builder.HasMany(u => u.SubmissionsAsStudent) // 一个 User (学生) 可以有多个提交记录
				.WithOne(s => s.Student)                 // 一个 Submission 对应一个 Student
				.HasForeignKey(s => s.StudentId)         // 外键在 Submission.StudentId
				.OnDelete(DeleteBehavior.Restrict);      // 限制删除：如果学生有提交记录，则不允许删除

			// User 作为批改者，与 Submission 的关系 (一对多)
			builder.HasMany(u => u.GradedSubmissions)  // 一个 User (批改者) 可以批改多个提交
				.WithOne(s => s.Grader)                // 一个 Submission 对应一个 Grader
				.HasForeignKey(s => s.GraderId)        // 外键在 Submission.GradedBy
				.OnDelete(DeleteBehavior.SetNull);     // 因为 GradedBy 是可空的，所以批改者删除时，设为 NULL
		}
	}
}
