using YBEE.EQM.Core;

namespace YBEE.EQM.Application;

/// <summary>
/// 上传学生信息输入参数
/// </summary>
public class UploadExamStudentInput: UploadExamDataInput
{
    /// <summary>
    /// 监测年级ID
    /// </summary>
    [Required]
    public int ExamGradeId { get; set; }
}

/// <summary>
/// 导入监测学生输入参数
/// </summary>
public class ImportExamStudentItem
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 监测年级ID
    /// </summary>
    [Required]
    public int ExamGradeId { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    [Required]
    public short GradeId { get; set; }
    /// <summary>
    /// 班级号
    /// </summary>
    [Required]
    public short ClassNumber { get; set; }
    /// <summary>
    /// 选科组合ID
    /// </summary>
    public short? NceeCourseCombId { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    [Required]
    public string Name { get; set; }
    /// <summary>
    /// 证件类型
    /// </summary>
    [Required]
    public CertificateType CertificateType { get; set; }
    /// <summary>
    /// 证件号码
    /// </summary>
    public string IdNumber { get; set; } = "";
    /// <summary>
    /// 性别
    /// </summary>
    public Gender? Gender { get; set; } = Core.Gender.UNKNOWN;
    /// <summary>
    /// 学籍号
    /// </summary>
    public string StudentNumber { get; set; }
    /// <summary>
    /// 自编监测号
    /// </summary>
    public string ExamNumber { get; set; }
    /// <summary>
    /// 考场号
    /// </summary>
    public string RoomNumber { get; set; } = "";
    /// <summary>
    /// 座位号
    /// </summary>
    public string SeatNumber { get; set; }
    /// <summary>
    /// 备注
    /// </summary>
    public string Remark { get; set; }
}

/// <summary>
/// 导入监测学生输入参数
/// </summary>
public class ImportExamStudentInput
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 监测年级ID
    /// </summary>
    [Required]
    public int ExamGradeId { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    [Required]
    public int GradeId { get; set; }
    /// <summary>
    /// 机构ID
    /// </summary>
    public short? SysOrgId { get; set; }
    /// <summary>
    /// 校区ID
    /// </summary>
    public short? SysOrgBranchId { get; set; }
    /// <summary>
    /// 导入行
    /// </summary>
    [Required]
    public List<ImportExamStudentItem> Items { get; set; }
    /// <summary>
    /// 数据导入模式
    /// </summary>
    [Required]
    public DataImportMode DataImportMode { get; set; }
}

/// <summary>
/// 添加监测学生输入参数
/// </summary>
public class AddExamStudentInput
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 机构ID
    /// </summary>
    public short? SysOrgId { get; set; }
    /// <summary>
    /// 校区ID
    /// </summary>
    public short? SysOrgBranchId { get; set; }
    /// <summary>
    /// 监测年级ID
    /// </summary>
    [Required]
    public int ExamGradeId { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    [Required]
    public short GradeId { get; set; }
    /// <summary>
    /// 班号
    /// </summary>
    [Required]
    public short ClassNumber { get; set; }
    /// <summary>
    /// 高中选科组合ID
    /// </summary>
    public short? NceeCourseCombId { get; set; }

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

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

/// <summary>
/// 更新监测学生输入参数
/// </summary>
public class UpdateExamStudentInput
{
    /// <summary>
    /// 主键
    /// </summary>
    [Required]
    public long Id { get; set; }

    /// <summary>
    /// 校区ID
    /// </summary>
    public short? SysOrgBranchId { get; set; }

    /// <summary>
    /// 班号
    /// </summary>
    [Required]
    public short ClassNumber { get; set; }
    /// <summary>
    /// 高中选科组合ID
    /// </summary>
    public short? NceeCourseCombId { get; set; }

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

    /// <summary>
    /// 考场号
    /// </summary>
    [StringLength(20)]
    public string RoomNumber { get; set; } = "";
    /// <summary>
    /// 座位号
    /// </summary>
    [StringLength(20)]
    public string SeatNumber { get; set; } = "";

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

/// <summary>
/// 清空监测学生输入参数
/// </summary>
public class ClearExamStudentInput
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
}

/// <summary>
/// 分页查询监测学生输入参数
/// </summary>
public class ExamStudentPageInput : PageInputBase
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 校区ID
    /// </summary>
    public short? SysOrgBranchId { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    public short? GradeId { get; set; }
    /// <summary>
    /// 班级号
    /// </summary>
    public short? ClassNumber { get; set; }
    /// <summary>
    /// 选科组合ID
    /// </summary>
    public short? NceeCourseCombId { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 证件类型
    /// </summary>
    public CertificateType? CertificateType { get; set; }
    /// <summary>
    /// 证件号码
    /// </summary>
    public string IdNumber { get; set; }
    /// <summary>
    /// 性别
    /// </summary>
    public Gender? Gender { get; set; }
    /// <summary>
    /// 学籍号
    /// </summary>
    public string StudentNumber { get; set; }
    /// <summary>
    /// 自编监测号
    /// </summary>
    public string ExamNumber { get; set; }
    /// <summary>
    /// 考场号
    /// </summary>
    public string RoomNumber { get; set; }
    /// <summary>
    /// 座位号
    /// </summary>
    public string SeatNumber { get; set; }
}

/// <summary>
/// 查询班级学生人数输出参数
/// </summary>
public class ExamStudentCountPageInput : PageInputBase
{
    /// <summary>
    /// 监测计划ID
    /// </summary>
    [Required]
    public int ExamPlanId { get; set; }
    /// <summary>
    /// 城乡类别
    /// </summary>
    public UrbanRuralType? UrbanRuralType { get; set; }
    /// <summary>
    /// 年级ID
    /// </summary>
    public short? GradeId { get; set; }
    /// <summary>
    /// 班级号
    /// </summary>
    public short? ClassNumber { get; set; }
    /// <summary>
    /// 学校名称
    /// </summary>
    public string SysOrgName { get; set; }
    /// <summary>
    /// 学校代码
    /// </summary>
    public string SysOrgCode { get; set; }
    /// <summary>
    /// 最少班级数量
    /// </summary>
    public int? ClassCountMin { get; set; }
    /// <summary>
    /// 最多班级数量
    /// </summary>
    public int? ClassCountMax { get; set; }
    /// <summary>
    /// 班级最少人数
    /// </summary>
    public int? StudentCountMin { get; set; }
    /// <summary>
    /// 班级最多人数
    /// </summary>
    public int? StudentCountMax { get; set; }

    /// <summary>
    /// 必须排除的班级ID列表
    /// </summary>
    public List<long> ExcludeSchoolClassIds { get; set; }
    /// <summary>
    /// 必须包含的班级ID列表
    /// </summary>
    public List<long> IncludeSchoolClassIds { get; set; }
}