// Copyright 2014 Tool Inc.

package com.tool.emailbot.adapter.jpa;

import com.tool.emailbot.common.adapter.jpa.repository.QueryHelper;
import com.tool.emailbot.common.domain.repository.Repository;
import com.tool.emailbot.domain.model.Dependencia;
import com.tool.emailbot.domain.model.Trabajador;
import com.tool.emailbot.domain.model.Trabajador_;
import com.tool.emailbot.domain.repository.TrabajadorRepository;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.criteria.JoinType;

/**
 * @author Jovani Rico (jovanimtzrico@gmail.com)
 */
public class JpaTrabajadorRepository implements TrabajadorRepository {

    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final Repository<Trabajador> repository;

    @Inject
    public JpaTrabajadorRepository(Repository<Trabajador> repository) {
        this.repository = repository;
    }

    @Override
    public void create(Trabajador trabajador) {
        repository.create(trabajador);
    }

    @Override
    public Trabajador update(Trabajador trabajador) {
        return repository.update(trabajador);
    }

    @Override
    public void delete(Trabajador trabajador) {
        repository.delete(trabajador);
    }

    @Override
    public Trabajador findBy(String numeroTrabajador) {
        Trabajador t = null;
        QueryHelper<Trabajador, Trabajador> qh = repository.newQueryHelper();
        qh.getQuery().where(qh.getBuilder().equal(
                qh.getRoot().get(Trabajador_.numeroTrabajador), numeroTrabajador));
        try {
            t = qh.getSingleResult();
        } catch (NoResultException | NonUniqueResultException exc) {
            logger.warn(exc.getMessage());
        }
        return t;
    }

    @Override
    //TODO(jovanimtzrico): The query seems to be wrong the argument is not being used
    public String findBy(Dependencia dependencia) {
        String email = null;
        QueryHelper<Trabajador, Trabajador> qh = repository.newQueryHelper();
        qh.getRoot().join(Trabajador_.dependencia, JoinType.INNER);
        qh.getQuery().where(qh.getBuilder().equal(qh.getRoot().get(Trabajador_.director), true));
        try {
            email = qh.getSingleResult().getPersona().getInformacionContacto().getEmail();
        } catch (NoResultException | NonUniqueResultException exc) {
            logger.warn(exc.getMessage());
        }
        return email;
    }
}

@@ -2214,32 +2214,164 @@
 etQuery().where(
+qh.getBuilder().and(%0A                qh.getBuilder().equal(qh.getRoot().get(Trabajador_.dependencia), dependencia),%0A                
 qh.getBuilder().
@@ -2422,16 +2422,17 @@
 , true))
+)
 ;%0A      

Fixing the query to pull the desired workers that are directors in a given dependency