using Jiaowu.Api.Domain.Common;

namespace Jiaowu.Api.Domain.Academic;

public sealed class CourseSelectionRound : EntityBase
{
    public Guid AcademicTermId { get; set; }
    public AcademicTerm? AcademicTerm { get; set; }
    public required string Name { get; set; }
    public DateTime StartsAt { get; set; }
    public DateTime EndsAt { get; set; }
    public DateTime WithdrawalEndsAt { get; set; }
    public decimal MaxCredits { get; set; } = 30;
    public int? MaxCourseCount { get; set; }
    public CourseSelectionRoundStatus Status { get; set; } =
        CourseSelectionRoundStatus.Draft;
    public string? Notes { get; set; }
    public ICollection<CourseSelectionRoundGrade> EligibleGrades { get; set; } = [];
    public ICollection<CourseSelectionOffering> Offerings { get; set; } = [];
}

public sealed class CourseSelectionRoundGrade : EntityBase
{
    public Guid CourseSelectionRoundId { get; set; }
    public CourseSelectionRound? CourseSelectionRound { get; set; }
    public int Grade { get; set; }
}

public sealed class CourseSelectionOffering : EntityBase
{
    public Guid CourseSelectionRoundId { get; set; }
    public CourseSelectionRound? CourseSelectionRound { get; set; }
    public Guid TeachingTaskId { get; set; }
    public TeachingTask? TeachingTask { get; set; }
    public int Capacity { get; set; }
    public bool IsOpenToAll { get; set; }
    public string? Notes { get; set; }
    public ICollection<CourseEnrollment> Enrollments { get; set; } = [];
}

public sealed class CourseEnrollment : EntityBase
{
    public Guid CourseSelectionOfferingId { get; set; }
    public CourseSelectionOffering? CourseSelectionOffering { get; set; }
    public Guid StudentId { get; set; }
    public Student? Student { get; set; }
    public CourseEnrollmentStatus Status { get; set; } = CourseEnrollmentStatus.Enrolled;
    public EnrollmentType EnrollmentType { get; set; } = EnrollmentType.Normal;
    public DateTime EnrolledAt { get; set; } = DateTime.UtcNow;
    public DateTime? WaitlistedAt { get; set; }
    public DateTime? WithdrawnAt { get; set; }
}

public enum CourseSelectionRoundStatus
{
    Draft = 1,
    Open = 2,
    Closed = 3
}

public enum CourseEnrollmentStatus
{
    Enrolled = 1,
    Withdrawn = 2,
    Waitlisted = 3,
    Cancelled = 4,
    Expired = 5
}

public enum EnrollmentType
{
    Normal = 1,
    Retake = 2
}
