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 ExamAbsentReplace : DEntityBase, IEntityTypeBuilder<ExamAbsentReplace>
{
    /// <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>
    /// 缺测学生姓名
    /// </summary>
    [Comment("缺测学生姓名")]
    [Required, StringLength(100)]
    public string AbsentName { get; set; }
    /// <summary>
    /// 缺测学生监测号
    /// </summary>
    [Comment("缺测学生监测号")]
    [Required, StringLength(20)]
    public string AbsentExamNumber { get; set; }
    /// <summary>
    /// 缺测科目
    /// [{"id": 1, "name": "语文", "shortName": "语"}]
    /// </summary>
    [Comment("缺测科目")]
    [Required, Column(TypeName = "json")]
    public string AbsentCourses { get; set; } = "[]";
    /// <summary>
    /// 缺测原因
    /// </summary>
    [Comment("缺测原因")]
    [Required, StringLength(200)]
    public string AbsentReason { get; set; }
    /// <summary>
    /// 是否有替补
    /// </summary>
    [Comment("是否有替补")]
    [Required]
    public bool IsReplaced { get; set; } = false;
    /// <summary>
    /// 替补学生姓名
    /// </summary>
    [Comment("替补学生姓名")]
    [StringLength(100)]
    public string ReplaceName { get; set; }
    /// <summary>
    /// 替补学生监测号
    /// </summary>
    [Comment("替补学生监测号")]
    [StringLength(20)]
    public string ReplaceExamNumber { get; set; }
    /// <summary>
    /// 家长姓名
    /// </summary>
    [StringLength(100)]
    public string PatriarchName { get; set; }
    /// <summary>
    /// 家长电话
    /// </summary>
    [StringLength(50)]
    public string PatriarchTel { get; set; }
    /// <summary>
    /// 备注
    /// </summary>
    [Comment("备注")]
    [StringLength(200)]
    public string Remark { get; set; }


    /// <summary>
    /// 状态
    /// </summary>
    [Comment("状态")]
    [Required, Column(TypeName = "smallint")]
    public AuditStatus Status { get; set; } = AuditStatus.AUDIT;

    /// <summary>
    /// 佐证材料
    /// </summary>
    [Comment("佐证材料")]
    [Column(TypeName = "json")]
    public string Attachments { get; set; } = "[]";
    /// <summary>
    /// 审核记录
    /// </summary>
    [Comment("审核记录")]
    [Required, Column(TypeName = "json")]
    public string Audits { 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; }

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