Skip to content
Snippets Groups Projects
Student.java 4.59 KiB
package de.thdeg.grademanager.model;

import de.thdeg.grademanager.interfaces.Calculable;
import de.thdeg.grademanager.model.enumeration.Mark;
import jakarta.persistence.*;
import org.hibernate.annotations.Cascade;

import java.time.LocalDateTime;
import java.util.*;

@Entity
@Table(name = "student")
public class Student extends UniversityMember implements Calculable
{
    @Column(name = "status")
    private String status;

    @Column(name = "paid_fees")
    private boolean paidFees;

    @Column(name = "semester")
    private int semester;

    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true) // cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    Set<Enrollment> enrollments;

    @OneToOne(fetch = FetchType.LAZY)
    private CoursesOfStudy coursesOfStudy;

    public Student()
    {

    }

    public Student(String gender, String firstName, String lastName, String placeOfResidence, String birthPlace,
                   String officialEmail, String privateEmail, String status,
                   boolean paidFess, int semester)
    {
        super(gender, firstName, lastName, placeOfResidence, birthPlace,
                officialEmail, privateEmail);
        this.status = status;
        this.paidFees = paidFess;
        this.semester = semester;
    }

    @Override
    public double calculateAverage() {
        double average = 0.0;
        int counter = 0;
        for (Enrollment enrollment: enrollments) {
            if (enrollment.getGrade() != null){
                average += enrollment.getGrade();
                counter++;
            }
        }
        return average / counter;
    }

    @Override
    public int calculateMedian() {
        List<Double> markList = new ArrayList<>();
        int median = 0;
        for (Enrollment enrollment:enrollments) {
            if (enrollment.getGrade() != null) {
                markList.add(enrollment.getGrade());
            }
        }
        Collections.sort(markList);
        median = markList.get(markList.size() / 2).intValue();
        if (markList.size() % 2 == 0)
            median = ((median + markList.get(markList.size() / 2 - 1).intValue()) / 2);
        return median;
    }

    @Override
    public String toString() {
        return getId() + " " + getFirstName() + " "+ getLastName();
    }

    public String getStatus()
    {
        return status;
    }

    public void setStatus(String status)
    {
        this.status = status;
    }

    public boolean isPaidFees()
    {
        return paidFees;
    }

    public void setPaidFees(boolean paidFees)
    {
        this.paidFees = paidFees;
    }

    public int getSemester()
    {
        return semester;
    }

    public void setSemester(int semester)
    {
        this.semester = semester;
    }

    public void setCoursesOfStudy(CoursesOfStudy coursesOfStudy){
        this.coursesOfStudy = coursesOfStudy;
    }

    public CoursesOfStudy getCoursesOfStudy(){
        return coursesOfStudy;
    }

    public void initEnrollments(List<Course> courses){
        for (Course course: courses) {
            System.out.println(course);
            enrollments.add(new Enrollment(this, course));
        }
    }

    public Set<Enrollment> getEnrollments(){
        return enrollments;
    }

    public void clearEnrollmentsOldCoursesOfStudy(CoursesOfStudy coursesOfStudy){
        List<Enrollment> enrollmentsToRemove = new ArrayList<>();
        for (Enrollment enrollment: enrollments){
            boolean courseToRemove = true;
            for(int i = 0; i < coursesOfStudy.getCourses().size() ; i++){
                if(enrollment.course.getId() == coursesOfStudy.getCourses().get(i).getId()){
                    courseToRemove = false;
                    break;
                }
            }
            if(courseToRemove){
                enrollmentsToRemove.add(enrollment);
            }
        }
        enrollments.removeAll(enrollmentsToRemove);
    }

    public void rateStudent(Course course, Mark mark){
        Enrollment temp = new Enrollment(this, course);
        enrollments.remove(temp);
        temp.setEnrollmentDate(LocalDateTime.now());
        temp.setGrade(mark.getMark());
    }

    public int[] getExamValues(){
        int passedExams = 0;
        int failedExams = 0;
        int openExams = 0;
        for (Enrollment enrollment: enrollments) {
            if(enrollment.getGrade() == null){
                openExams++;
            } else if(enrollment.getGrade() > 4.0 ){
                failedExams++;
            } else{
                passedExams++;
            }
        }
        return new int[]{passedExams, failedExams, openExams};
    }
}