using Jiaowu.Api.Domain.Common;

namespace Jiaowu.Api.Domain.Academic;

public sealed class Teacher : EntityBase
{
    public required string TeacherNumber { get; set; }
    public required string Name { get; set; }
    public Gender Gender { get; set; }
    public Guid CollegeId { get; set; }
    public College? College { get; set; }
    public string? Title { get; set; }
    public TeacherStatus Status { get; set; } = TeacherStatus.Active;
    public DateOnly? HireDate { get; set; }
    public bool IsExternal { get; set; }
    public string? Phone { get; set; }
    public string? Email { get; set; }
    public string? Notes { get; set; }
    public Guid? UserId { get; set; }
}

public sealed class Student : EntityBase
{
    public required string StudentNumber { get; set; }
    public required string Name { get; set; }
    public Gender Gender { get; set; }
    public Guid AdministrativeClassId { get; set; }
    public AdministrativeClass? AdministrativeClass { get; set; }
    public int EnrollmentYear { get; set; }
    public DateOnly EnrollmentDate { get; set; }
    public StudentStatus Status { get; set; } = StudentStatus.Active;
    public DateOnly? DateOfBirth { get; set; }
    public string? EnglishName { get; set; }
    public string? IdCardNumber { get; set; }
    public string? Nationality { get; set; }
    public string? Ethnicity { get; set; }
    public string? PoliticalStatus { get; set; }
    public string? NativePlace { get; set; }
    public string? HouseholdAddress { get; set; }
    public string? CurrentAddress { get; set; }
    public string? PostalCode { get; set; }
    public string? Phone { get; set; }
    public string? Email { get; set; }
    public string? Qq { get; set; }
    public string? WeChat { get; set; }
    public string? EmergencyContactName { get; set; }
    public string? EmergencyContactRelationship { get; set; }
    public string? EmergencyContactPhone { get; set; }
    public string? SpecialTags { get; set; }
    public string? SpecialNeeds { get; set; }
    public string? Biography { get; set; }
    public string? Notes { get; set; }
    public Guid? UserId { get; set; }
}

public sealed class Course : CatalogEntity
{
    public Guid CollegeId { get; set; }
    public College? College { get; set; }
    public Guid? CourseCategoryId { get; set; }
    public CourseCategory? CourseCategory { get; set; }
    public string? EnglishName { get; set; }
    public decimal Credits { get; set; }
    public int TotalHours { get; set; }
    public int LectureHours { get; set; }
    public int PracticeHours { get; set; }
    public CourseNature Nature { get; set; }
    public AssessmentMethod AssessmentMethod { get; set; }
    public string? Description { get; set; }
    public ICollection<CoursePrerequisite> Prerequisites { get; set; } = [];
    public ICollection<CoursePrerequisite> RequiredByCourses { get; set; } = [];
}

public sealed class CoursePrerequisite : EntityBase
{
    public Guid CourseId { get; set; }
    public Course? Course { get; set; }
    public Guid PrerequisiteCourseId { get; set; }
    public Course? PrerequisiteCourse { get; set; }
}

public sealed class CourseCategory : CatalogEntity
{
}

public enum Gender
{
    Unknown = 0,
    Male = 1,
    Female = 2
}

public enum TeacherStatus
{
    Active = 1,
    OnLeave = 2,
    Retired = 3,
    Departed = 4
}

public enum StudentStatus
{
    Active = 1,
    Suspended = 2,
    Graduated = 3,
    Withdrawn = 4
}

public enum CourseNature
{
    GeneralRequired = 1,
    MajorRequired = 2,
    MajorElective = 3,
    GeneralElective = 4,
    Practice = 5
}

public enum AssessmentMethod
{
    Examination = 1,
    Assessment = 2
}
