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

namespace TechHelper.Context.Configuration
{
	public class SubmissionConfiguration : IEntityTypeConfiguration<Submission>
	{
		public void Configure(EntityTypeBuilder<Submission> builder)
		{
			// 1. 设置表名
			builder.ToTable("submissions");

			// 2. 设置主键
			builder.HasKey(s => s.Id);

			// 3. 配置列名、必需性、精度及其他属性

			// Id
			builder.Property(s => s.Id)
				.HasColumnName("id");

			// AssignmentId
			builder.Property(s => s.ExamId)
				.HasColumnName("assignment_id")
				.IsRequired();

			// StudentId
			builder.Property(s => s.StudentId)
				.HasColumnName("student_id")
				.IsRequired();

			builder.Property(s => s.AttemptNumber)
				.HasColumnName("attempt_number")
				.IsRequired();

			builder.Property(s => s.SubmissionTime)
				.HasColumnName("submission_time"); // 没有 [Required] 属性，所以可以是可空的

			builder.Property(s => s.OverallGrade)
				.HasColumnName("overall_grade")
				.IsRequired()
				.HasPrecision(5, 2); // 应用精度设置

			// OverallFeedback
			builder.Property(s => s.OverallFeedback)
				.HasColumnName("overall_feedback");

			// GradedBy (现为 Guid? 类型)
			builder.Property(s => s.GraderId)
				.HasColumnName("graded_by"); 


			builder.Property(s => s.GradedAt)
				.HasColumnName("graded_at");


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

			builder.Property(s => s.Status)
				.HasColumnName("status")
				.IsRequired()
				.HasMaxLength(15);     




			builder.HasOne(s => s.Exam)         // 当前 Submission 有一个 Assignment
				.WithMany(a => a.Submissions)         // 那个 Assignment 可以有多个 Submission
				.HasForeignKey(s => s.ExamId)   // 外键是 Submission.AssignmentId
				.OnDelete(DeleteBehavior.Cascade);    // 当 Assignment 被删除时，相关的 Submission 也级联删除。


			builder.HasOne(s => s.Student)             // 当前 Submission 有一个 Student (User)
				.WithMany(u => u.SubmissionsAsStudent) // 那个 User (Student) 可以有多个 Submission
				.HasForeignKey(s => s.StudentId)       // 外键是 Submission.StudentId
				.OnDelete(DeleteBehavior.Cascade);    // 当 User (Student) 被删除时，如果还有其提交的 Submission，则会阻止删除。

			builder.HasOne(s => s.Grader)              // 当前 Submission 有一个 Grader (User)，可以是空的
				.WithMany(u => u.GradedSubmissions)    // 那个 User (Grader) 可以批改多个 Submission
				.HasForeignKey(s => s.GraderId)        // 外键是 Submission.GradedBy
				.OnDelete(DeleteBehavior.SetNull);     // 当 User (Grader) 被删除时，如果 GradedBy 是可空的，则将其设置为 NULL。

		}
	}
}
