using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace YBEE.EQM.Core;

/// <summary>
/// 监测学生
/// </summary>
[Comment("监测样本学生")]
public class ExamStudent : DEntityBase<long>, IEntityTypeBuilder<ExamStudent>
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Comment("监测计划ID")]
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 机构ID
    /// </summary>
    [Comment("机构ID")]
    [Required]
    public short SysOrgId { get; set; }
    /// <summary>
    /// 校区ID
    /// </summary>
    [Comment("校区ID")]
    public short? SysOrgBranchId { get; set; }
    /// <summary>
    /// 监测年级ID
    /// </summary>
    [Comment("监测年级ID")]
    [Required]
    public int ExamGradeId { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    [Comment("年级ID")]
    [Required]
    public short GradeId { get; set; }
    /// <summary>
    /// 班级ID
    /// </summary>
    [Comment("班级ID")]
    [Required]
    public long SchoolClassId { get; set; }
    /// <summary>
    /// 班号
    /// </summary>
    [Comment("班号")]
    [Required]
    public short ClassNumber { get; set; }
    ///// <summary>
    ///// 班级学生ID
    ///// </summary>
    //[Comment("班级学生ID")]
    //[Required]
    //public int SchoolClassStudentId { get; set; }
    ///// <summary>
    ///// 学生信息ID
    ///// </summary>
    //[Comment("学生信息ID")]
    //[Required]
    //public int PersonId { get; set; }
    /// <summary>
    /// 高中选科组合ID
    /// </summary>
    [Comment("高中选科组合ID")]
    public short? NceeCourseCombId { get; set; }

    /// <summary>
    /// 自编监测号
    /// </summary>
    [Comment("自编监测号")]
    [StringLength(20)]
    public string ExamNumber { get; set; } = "";
    /// <summary>
    /// 学籍号
    /// </summary>
    [Comment("学籍号")]
    [StringLength(100)]
    public string StudentNumber { get; set; } = "";
    /// <summary>
    /// 考场号
    /// </summary>
    [Comment("考场号")]
    [StringLength(20)]
    public string RoomNumber { get; set; } = "";
    /// <summary>
    /// 座位号
    /// </summary>
    [Comment("座位号")]
    [StringLength(20)]
    public string SeatNumber { get; set; } = "";

    /// <summary>
    /// 姓名
    /// </summary>
    [Comment("姓名")]
    [Required, StringLength(100)]
    public string Name { get; set; }
    /// <summary>
    /// 证件类型
    /// </summary>
    [Comment("证件类型")]
    [Required, Column(TypeName = "smallint")]
    public CertificateType CertificateType { get; set; } = CertificateType.NONE;
    /// <summary>
    /// 证件号码
    /// </summary>
    [Comment("证件号码")]
    [StringLength(50)]
    public string IdNumber { get; set; } = "";
    /// <summary>
    /// 出生日期
    /// </summary>
    [Comment("出生日期")]
    public DateTime? BirthDate { get; set; }
    /// <summary>
    /// 性别
    /// </summary>
    [Comment("性别")]
    [Required, Column(TypeName = "smallint")]
    public Gender Gender { get; set; } = Gender.UNKNOWN;
    /// <summary>
    /// 备注
    /// </summary>
    [Comment("备注")]
    [StringLength(200)]
    public string Remark { get; set; }

    /// <summary>
    /// 一对一引用（机构）
    /// </summary>
    public virtual SysOrg SysOrg { get; set; }
    /// <summary>
    /// 一对一引用（年级）
    /// </summary>
    public virtual Grade Grade { get; set; }
    /// <summary>
    /// 一对一引用（班级）
    /// </summary>
    public virtual SchoolClass SchoolClass { get; set; }
    /// <summary>
    /// 一对一引用（校区）
    /// </summary>
    public virtual SysOrg SysOrgBranch { get; set; }
    /// <summary>
    /// 一对一引用（监测年级）
    /// </summary>
    public virtual ExamGrade ExamGrade { get; set; }
    ///// <summary>
    ///// 一对一引用（班级学生）
    ///// </summary>
    //public virtual SchoolClassStudent SchoolClassStudent { get; set; }
    ///// <summary>
    ///// 一对一引用（学生信息）
    ///// </summary>
    //public virtual Person Person { get; set; }

    public void Configure(EntityTypeBuilder<ExamStudent> entityBuilder, DbContext dbContext, Type dbContextLocator)
    {
        entityBuilder.HasIndex(a => new { a.ExamPlanId, a.SysOrgId }).HasDatabaseName("idx_exam_student_exam_plan_id_sys_org_id");
        entityBuilder.HasIndex(a => new { a.ExamPlanId, a.SysOrgId, a.SchoolClassId }).HasDatabaseName("idx_exam_student_exam_plan_id_soid_scid");
    }
}
