using IRaCIS.Core.Domain.Models;
using Microsoft.EntityFrameworkCore.Metadata.Builders;


namespace IRaCIS.Core.Infra.EFCore.EntityConfigration
{
    public class SubjectConfigration : IEntityTypeConfiguration<Subject>
    {
        public void Configure(EntityTypeBuilder<Subject> builder)
        {
            //不能同时配置一对多 和一对一 但是有时表要存储多的最新的  比如受试者 最新的访视  在这里要显示配置
            builder.HasOne(s => s.LatestSubjectVisit).WithMany().HasForeignKey(t => t.LatestSubjectVisitId);
            builder.HasOne(s => s.FinalSubjectVisit).WithMany().HasForeignKey(t => t.FinalSubjectVisitId);
            builder.HasMany(s => s.SubjectVisitList).WithOne(sv => sv.Subject).HasForeignKey(t => t.SubjectId);
        }
    }
    public class DictionaryConfigration : IEntityTypeConfiguration<Dictionary>
    {
        public void Configure(EntityTypeBuilder<Dictionary> builder)
        {
            builder.HasOne(t => t.ConfigDictionary).WithMany().HasForeignKey(d => d.ConfigTypeId);
            //自身同时存在一对多 和一对一的关系，配置一对多的就可以，一对一 不用配置，有点奇怪
            builder.HasMany(t => t.ChildList).WithOne(t => t.Parent).HasForeignKey(d => d.ParentId);
        }
    }

    public class NoneDicomStudyConfigration : IEntityTypeConfiguration<NoneDicomStudy>
    {
        public void Configure(EntityTypeBuilder<NoneDicomStudy> builder)
        {
            //同样一个实体 有两个相同的类型的导航属性，需要手动配置
            builder.HasMany(t => t.NoneDicomFileList).WithOne(s => s.NoneDicomStudy).HasForeignKey(t => t.NoneDicomStudyId);
            builder.HasMany(t => t.TaskNoneDicomFileList).WithOne(s => s.OriginNoneDicomStudy).HasForeignKey(t => t.OriginNoneDicomStudyId);
        }
    }

    public class SubjectUserConfigration : IEntityTypeConfiguration<SubjectUser>
    {
        public void Configure(EntityTypeBuilder<SubjectUser> builder)
        {
            //自身存在一对多的关系
            //对于替换后的医生而言，关联多个之前的医生
            builder.HasMany(t => t.EarlierSubjectUserList).WithOne(t => t.ReplacedSubjectUser).HasForeignKey(t => t.ReplacedSubjectUserId);
        }
    }

    public class UserConfigration : IEntityTypeConfiguration<User>
    {
        public void Configure(EntityTypeBuilder<User> builder)
        {
            //User 和VisitTask 存在一对多的关系  这里不显式配置就报错，why?
            builder.HasMany(t => t.VisitTaskList).WithOne(t => t.DoctorUser).HasForeignKey(t => t.DoctorUserId);

            //builder.HasOne(t => t.Doctor).WithOne(t => t.User);
        }
    }

    public class SystemDocConfirmedUserConfigration : IEntityTypeConfiguration<SystemDocConfirmedUser>
    {
        public void Configure(EntityTypeBuilder<SystemDocConfirmedUser> builder)
        {
            #region 不用显示配置
            //// 配置 CreateUser 关系
            //builder.HasOne(s => s.CreateUser)
            //    .WithMany()  // 假设 User 表没有对应的反向导航属性，如果有，填入属性名
            //    .HasForeignKey(s => s.CreateUserId);
            ////.OnDelete(DeleteBehavior.Restrict);  // 可根据业务需求调整删除行为
            #endregion

            // 配置 ConfirmUser 关系  （一个用户可以签名多个文档）
            builder.HasOne(s => s.ConfirmUser)  // ConfirmUser
                .WithMany(t => t.SystemDocConfirmedList)
                .HasForeignKey(s => s.ConfirmUserId);
            //.OnDelete(DeleteBehavior.Restrict);
        }
    }

    public class TrialUserConfigration : IEntityTypeConfiguration<TrialUser>
    {
        //当一个实体，针对同一个类，有两个一对一导航属性，但是是不同的外键，一个外键是一对一，一个是一对多，那么需要显示配置一对多的关系
        public void Configure(EntityTypeBuilder<TrialUser> builder)
        {
            //TrialUser  和User 之间 一对多 （一个用户可以参与多个项目）
            builder.HasOne(s => s.User)
              .WithMany(t => t.UserTrials)
              .HasForeignKey(s => s.UserId);

            //TrialUser User 一对一  创建人
        }
    }

}
