package dst.ass1.jpa.dao.impl;

import dst.ass1.jpa.dao.IMaterialServerDAO;
import dst.ass1.jpa.model.ICourse;
import dst.ass1.jpa.model.IMaterialServer;
import dst.ass1.jpa.model.impl.Lesson;
import dst.ass1.jpa.model.impl.Material;
import dst.ass1.jpa.model.impl.MaterialServer;
import dst.ass1.jpa.util.Constants;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import java.util.Collection;
import java.util.List;

public class MaterialServerDAO extends GenericDAO<MaterialServer, IMaterialServer> implements IMaterialServerDAO {
    public MaterialServerDAO(EntityManager em) {
        super(em, MaterialServer.class);
    }

    @Override
    public Collection<IMaterialServer> findMaterialServersForCourse(ICourse course) {
        CriteriaBuilder b = em.getCriteriaBuilder();
        CriteriaQuery<IMaterialServer> q = b.createQuery(IMaterialServer.class);

        Root<MaterialServer> root = q.from(MaterialServer.class);
        Join<MaterialServer, Material> materials = root.join(Constants.A_MATERIALS);
        Join<Material, Lesson> lessons = materials.join(Constants.M_MATERIAL_LESSON);

        q.select(root).distinct(true);
        if (course != null) q.where(lessons.in(course.getLessons()));

        List<IMaterialServer> a = em.createQuery(q).getResultList();
        return a;
    }
}
