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

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.lokalisierung.entity.Lokalisierung;
import de.ivu.elect.business.lokalisierung.entity.QLokalisierung;
import de.ivu.elect.jee.entity.QueryDsl;

public class LokalisierungSearch extends AbstractLokalisierungSearch {

  public LokalisierungSearch() {
    super();
  }

  @Override
  protected List<Lokalisierung> querySearchResult(LokalisierungSearchParameters searchParameters) {
    QueryDsl qdsl = dao.getQueryDsl();
    QLokalisierung lokalisierungTabelle = QLokalisierung.lokalisierung;
    qdsl.from(lokalisierungTabelle);

    qdsl.likeIfNotBlank(lokalisierungTabelle.schluessel, searchParameters.getLokalisierung().getSchluessel());
    qdsl.eqIfNotNull(lokalisierungTabelle.locale, searchParameters.getLokalisierung().getLocale());
    qdsl.eqIfNotNull(lokalisierungTabelle.modul, searchParameters.getLokalisierung().getModul());

    String wertGeaendert = searchParameters.getLokalisierung().getWertGeaendert();

    // Verwendeter Wert geht auf LokalisierungStore, nicht auf DB
    //    if (wertGeaendert!=null && StringUtils.isNotBlank(wertGeaendert)){
    //      // qdsl.getQuery().where(lokalisierungTabelle.wertGeaendert.isNull().and(lokalisierungTabelle.wertPropertydatei.toLowerCase().like(convertSearchPattern(wertGeaendert.toLowerCase()))).or(lokalisierungTabelle.wertGeaendert.toLowerCase().like(convertSearchPattern(wertGeaendert.toLowerCase()))));
    //    }

    if (searchParameters.getLokalisierungWertNichtVorhanden() != null) {
      searchParameters.getLokalisierungWertNichtVorhanden().appendQuery(qdsl, lokalisierungTabelle);
    }

    qdsl.orderBy(lokalisierungTabelle.modul.asc(), lokalisierungTabelle.schluessel.asc(), lokalisierungTabelle.locale.asc());

    List<Lokalisierung> result = qdsl.list(lokalisierungTabelle);
    if (wertGeaendert != null) {
      result = filtereVerwendeterWert(wertGeaendert, result);
    }

    if (!searchParameters.isSchluesselMitPunktAmEndeAnzeigen()) {
      result = entferneSchluesselPunkteAmEnde(result);
    }

    if (searchParameters.isSchluesselSetVorhanden()) {
      result = nurSchluesselImSetBetrachten(result, searchParameters.getSchluesselSet());
    }

    return result;
  }

  private List<Lokalisierung> nurSchluesselImSetBetrachten(List<Lokalisierung> alle, Set<String> schluesselSet) {
    List<Lokalisierung> result = new ArrayList<>(schluesselSet.size());

    for (Lokalisierung lokalisierung : alle) {
      if (schluesselSet.contains(lokalisierung.getSchluessel())) {
        result.add(lokalisierung);
      }
    }

    return result;
  }

  private List<Lokalisierung> entferneSchluesselPunkteAmEnde(List<Lokalisierung> alle) {
    List<Lokalisierung> result = new ArrayList<>(alle.size());

    for (Lokalisierung lokalisierung : alle) {
      if (!lokalisierung.getSchluessel().endsWith(".")) {
        result.add(lokalisierung);
      }
    }

    return result;
  }

  private List<Lokalisierung> filtereVerwendeterWert(String wertGeaendert, List<Lokalisierung> alle) {
    if (StringUtils.isBlank(wertGeaendert)) {
      return alle;
    }

    List<Lokalisierung> result = new ArrayList<>(alle.size());

    String wertGeaendertToLower = wertGeaendert.toLowerCase();

    for (Lokalisierung lokalisierung : alle) {
      String wertVerwendet = lokalisierung.getWertVerwendet();
      if (wertVerwendet != null && wertVerwendet.toLowerCase().contains(wertGeaendertToLower)) {
        result.add(lokalisierung);
      }
    }

    return result;
  }
}
