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.model.IMaterial;
import dst.ass1.jpa.util.Constants;

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

@Entity
@Table(name = Constants.T_LESSON)
public class Lesson implements ILesson {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String description;

    @Column
    private Date start;

    @Column
    private Date end;

    @ManyToOne(targetEntity = Course.class)
    @JoinColumn(name = Constants.I_COURSE)
    private ICourse course;

    @ManyToMany(targetEntity = Lecturer.class, mappedBy = Constants.M_LECTURER_LESSONS)
    private Collection<ILecturer> lecturers = new ArrayList<>();

    @ManyToMany(targetEntity = Lesson.class)
    @JoinTable(name = Constants.J_LESSONS_REQUIRED)
    private Collection<ILesson> requiredLessons = new ArrayList<>();

    @ManyToMany(targetEntity = Lesson.class, mappedBy = Constants.M_LESSON_REQUIRED)
    private Collection<ILesson> requiredLessonsBy = new ArrayList<>();

    @OneToMany(targetEntity = Material.class, mappedBy = Constants.M_MATERIAL_LESSON)
    private Collection<IMaterial> materials = new ArrayList<>();

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public Date getStart() {
        return start;
    }

    @Override
    public void setStart(Date start) {
        this.start = start;
    }

    @Override
    public Date getEnd() {
        return end;
    }

    @Override
    public void setEnd(Date end) {
        this.end = end;
    }

    @Override
    public ICourse getCourse() {
        return course;
    }

    @Override
    public void setCourse(ICourse course) {
        this.course = course;
    }

    @Override
    public Collection<ILecturer> getLecturers() {
        return lecturers;
    }

    @Override
    public void setLecturers(Collection<ILecturer> lecturers) {
        this.lecturers = lecturers;
    }

    @Override
    public void addLecturer(ILecturer lecturer) {
        this.lecturers.add(lecturer);
    }

    @Override
    public Collection<ILesson> getRequiredLessons() {
        return requiredLessons;
    }

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

    @Override
    public void addRequiredLesson(ILesson lesson) {
        this.requiredLessons.add(lesson);
    }

    @Override
    public Collection<ILesson> getRequiredByLessons() {
        return requiredLessonsBy;
    }

    @Override
    public void setRequiredByLessons(Collection<ILesson> requiredByLessons) {
        this.requiredLessonsBy = requiredByLessons;
    }

    @Override
    public void addRequiredByLesson(ILesson lesson) {
        this.requiredLessonsBy.add(lesson);
    }

    @Override
    public Collection<IMaterial> getMaterials() {
        return materials;
    }

    @Override
    public void setMaterials(Collection<IMaterial> materials) {
        this.materials = materials;
    }

    @Override
    public void addMaterial(IMaterial material) {
        this.materials.add(material);
    }
}
