namespace Domain.Services;

using Domain.Entities;
using Domain.Exceptions;

public class EnrollmentDomainService
{
    public void ValidateEnrollment(Student student, Subject subject)
    {
        if (!student.CanEnroll())
            throw new MaxEnrollmentsExceededException(student.Id);

        if (student.HasProfessor(subject.ProfessorId))
            throw new SameProfessorConstraintException(student.Id, subject.ProfessorId);

        if (student.Enrollments.Any(e => e.SubjectId == subject.Id))
            throw new DuplicateEnrollmentException(student.Id, subject.Id);
    }

    public Enrollment CreateEnrollment(Student student, Subject subject)
    {
        ValidateEnrollment(student, subject);

        var enrollment = new Enrollment(student.Id, subject.Id);
        student.AddEnrollment(enrollment);

        return enrollment;
    }
}
