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

import java.util.Collections;
import java.util.List;

import javax.inject.Inject;

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

import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.wahl.boundary.WahlterminExtendedDAO;
import de.ivu.elect.business.wahl.control.WahlExtendedAttacher;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

public class DateiImportSearch extends AbstractDateiImportSearch {

  private static final Logger LOG = LoggerFactory.getLogger(DateiImportSearch.class);

  @Inject
  private transient WahlExtendedAttacher wahlExtendedDAO;

  @Inject
  private transient WahlterminExtendedDAO wahlterminExtendedDAO;

  public DateiImportSearch() {
    super();
  }

  @Override
  protected List<DateiImport> querySearchResult(DateiImportSearchParameters searchParameters) {
    if (searchParameters.getSelectedImportArt() == null) {
      return Collections.emptyList();
    }

    List<DateiImport> result;

    if (searchParameters.isSpecificPerWahlOrWahltermin()) {
      result = findWithWahlOrWahltermin(searchParameters);
    } else {
      result = dao.findByDateiImportArtOrderBeiErstellungszeitpunktDesc(searchParameters.getMandant(), searchParameters.getSelectedImportArt());
    }

    for (DateiImport dateiImport : result) {
      dateiImport.getDatei().getDateiname(); // Eager-Loading für Arme...
    }

    return result;
  }

  private List<DateiImport> findWithWahlOrWahltermin(DateiImportSearchParameters searchParameters) {
    if (searchParameters.getWahltermin() != null) {
      Wahltermin wahltermin = wahlterminExtendedDAO.attach(searchParameters.getWahltermin());

      if (wahltermin == null) {
        return Collections.emptyList();
      }

      return dao.findByDateiImportArtAndWahlterminOrderBeiErstellungszeitpunktDesc(searchParameters.getSelectedImportArt(), wahltermin);
    } else if (searchParameters.getWahl() != null) {
      Wahl wahl = wahlExtendedDAO.attach(searchParameters.getWahl());

      if (wahl == null) {
        return Collections.emptyList();
      }

      return dao.findByDateiImportArtAndWahlOrderBeiErstellungszeitpunktDesc(searchParameters.getSelectedImportArt(), wahl);
    } else {
      LOG.warn("Wahl und Wahltermin sind null");
      return Collections.emptyList();
    }
  }
}
