
package de.ivu.elect.business.email.boundary;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import com.querydsl.jpa.JPAExpressions;
import com.querydsl.jpa.JPQLQuery;

import de.ivu.elect.business.email.entity.Email;
import de.ivu.elect.business.email.entity.EmailVorgang;
import de.ivu.elect.business.email.entity.QEmail;
import de.ivu.elect.business.email.entity.QEmailVorgang;
import de.ivu.elect.business.person.entity.QPersonendaten;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.jee.entity.QueryDsl;

@Stateless
public class EmailVorgangSearch extends AbstractEmailVorgangSearch {

  @Inject
  private transient WahlterminSessionSelect wahlterminSessionSelect;

  @Inject
  private transient WahlSessionSelector wahlSessionSelector;

  public EmailVorgangSearch() {
    super();
  }

  @Override
  protected List<EmailVorgang> querySearchResult(EmailVorgangSearchParameters searchParameters) {
    QueryDsl queryDsl = dao.getQueryDsl();

    QEmailVorgang emailVorgang = QEmailVorgang.emailVorgang;

    queryDsl.from(emailVorgang);

    queryDsl.eqIfNotNull(emailVorgang.status, searchParameters.getStatus());
    queryDsl.likeIfNotBlank(emailVorgang.betreff, searchParameters.getBetreff());
    queryDsl.eqIfNotNull(emailVorgang.typ, searchParameters.getTyp());
    queryDsl.likeIfNotBlank(emailVorgang.benutzerkennung, searchParameters.getBenutzerkennung());
    queryDsl.eqIfNotNull(emailVorgang.emailVorlage, searchParameters.getEmailVorlage());
    queryDsl.eqIfNotNull(emailVorgang.emailLayout, searchParameters.getEmailLayout());
    queryDsl.eqIfNotNull(emailVorgang.wahltermin, wahlterminSessionSelect.getEntity());
    queryDsl.eqIfNotNull(emailVorgang.wahl, wahlSessionSelector.getEntity());

    if (searchParameters.isEmailSuchparameterGesetzt()) {
      QEmail email = QEmail.email;
      JPQLQuery<Email> emailSubQuery = JPAExpressions.selectFrom(email).where(email.emailVorgang.eq(emailVorgang));
      QueryDsl emailQueryDsl = new QueryDsl(emailSubQuery);
      emailQueryDsl.likeIfNotBlank(email.empfaenger, searchParameters.getEmpfaenger());

      QPersonendaten personendaten = email.personendaten;

      emailQueryDsl.likeNormalizedIfNotBlank(personendaten.familiennameNormalisiert, searchParameters.getFamilienname());
      emailQueryDsl.likeInAnyNormalizedIfNotBlank(personendaten.rufnameNormalisiert, personendaten.vornamenNormalisiert, searchParameters.getVornameSeparator(), searchParameters.getVorname());

      queryDsl.getQuery().where(emailSubQuery.exists());
    }

    queryDsl.orderBy(emailVorgang.erstellungszeitpunkt.desc());

    return queryDsl.list(emailVorgang);
  }
}
