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

namespace TechHelper.Context.Configuration
{
	public class SubmissionDetailConfiguration : IEntityTypeConfiguration<SubmissionDetail>
	{
		public void Configure(EntityTypeBuilder<SubmissionDetail> builder)
		{
			builder.ToTable("submission_details");

			builder.HasKey(sd => sd.Id);

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

			builder.Property(sd => sd.SubmissionId)
				.HasColumnName("submission_id")
				.IsRequired();

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

			builder.Property(sd => sd.ExamQuestionId)
				.HasColumnName("assignment_question_id")
				.IsRequired();

			builder.Property(sd => sd.StudentAnswer)
				.HasColumnName("student_answer"); // string 默认可空

			builder.Property(sd => sd.IsCorrect)
				.HasColumnName("is_correct"); // bool? 默认可空

			builder.Property(sd => sd.PointsAwarded)
				.HasColumnName("points_awarded")
				.HasPrecision(5, 2); // 应用 [Precision(5, 2)] 设置

			builder.Property(sd => sd.TeacherFeedback)
				.HasColumnName("teacher_feedback"); // string 默认可空

			builder.Property(sd => sd.CreatedAt)
				.HasColumnName("created_at")
				.IsRequired()
				.ValueGeneratedOnAdd(); // 在实体首次保存时自动设置值

			builder.Property(sd => sd.UpdatedAt)
				.HasColumnName("updated_at")
				.IsRequired()
				.ValueGeneratedOnAddOrUpdate() // 在实体添加或更新时自动设置值
				.IsConcurrencyToken();       // 用作乐观并发控制，防止同时修改同一记录


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

			builder.HasOne(sd => sd.Submission)          // 当前 SubmissionDetail 有一个 Submission
				.WithMany(s => s.SubmissionDetails)      // 那个 Submission 可以有多个 SubmissionDetail 记录
				.HasForeignKey(sd => sd.SubmissionId)    // 外键是 SubmissionDetail.SubmissionId
				.OnDelete(DeleteBehavior.Cascade);       // 当 Submission 被删除时，相关的 SubmissionDetail 记录也级联删除。

			builder.HasOne(sd => sd.Student)                     // 当前 SubmissionDetail 有一个 User (作为学生)
				.WithMany(u => u.SubmissionDetails)		
				.HasForeignKey(sd => sd.StudentId)            // 外键是 SubmissionDetail.StudentId
				.OnDelete(DeleteBehavior.Cascade);           // 当 User (学生) 被删除时，如果他/她还有提交详情，则会阻止删除。
															  // 这是一个更安全的选择，以防止意外数据丢失。

			builder.HasOne(sd => sd.ExamQuestion)          // 当前 SubmissionDetail 有一个 AssignmentQuestion
				.WithMany(aq => aq.SubmissionDetails)           // 那个 AssignmentQuestion 可以有多个 SubmissionDetail 记录
				.HasForeignKey(sd => sd.ExamQuestionId)   // 外键是 SubmissionDetail.AssignmentQuestionId
				.OnDelete(DeleteBehavior.Cascade);              // 当 AssignmentQuestion 被删除时，相关的 SubmissionDetail 记录也级联删除。
		}
	}
}
