package dst.ass1.jpa.model.impl;

import dst.ass1.jpa.model.ICourse;
import dst.ass1.jpa.model.ILecturer;
import dst.ass1.jpa.model.ILesson;
import dst.ass1.jpa.util.Constants;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;

@Entity
@Table(name = Constants.T_LECTURER)
@PrimaryKeyJoinColumn(name = "id")
@NamedQuery(name = Constants.Q_MOST_ACTIVE_LECTURER, query = "SELECT l" +
        " FROM " + Constants.T_LECTURER + " l" +
        " WHERE size(l.lessons) >= ALL(" +
        " SELECT size(le.lessons) FROM " + Constants.T_LECTURER + " as le GROUP BY le" +
        " )")
@NamedQuery(name = Constants.Q_UPCOMING_LESSONS, query = "SELECT lec,les" +
        " FROM " + Constants.T_LECTURER + " as lec " +
        " JOIN lec.lessons les" +
        " WHERE les.course = :course AND les.start > :now" +
        " ORDER BY les.start")
public class Lecturer extends Person implements ILecturer {
    @OneToMany(targetEntity = Course.class, mappedBy = Constants.M_COURSE_LECTURER)
    private Collection<ICourse> courses = new ArrayList<>();

    @ManyToMany(targetEntity = Lesson.class)
    @JoinTable(name = Constants.J_LECTURER_LESSON,
            joinColumns = {
                    @JoinColumn(name = Constants.I_LECTURER)
            },
            inverseJoinColumns = {
                    @JoinColumn(name = Constants.I_LESSON)
            })
    private Collection<ILesson> lessons = new ArrayList<>();


    @Override
    public Collection<ICourse> getCourses() {
        return courses;
    }

    @Override
    public void setCourses(Collection<ICourse> courses) {
        this.courses = courses;
    }

    @Override
    public void addCourse(ICourse course) {
        this.courses.add(course);
    }

    @Override
    public Collection<ILesson> getLessons() {
        return lessons;
    }

    @Override
    public void setLessons(Collection<ILesson> lessons) {
        this.lessons = lessons;
    }

    @Override
    public void addLesson(ILesson lesson) {
        this.lessons.add(lesson);
    }
}
