package de.ivu.elect.business.dokumente.control;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

import de.ivu.elect.business.dokumente.boundary.DokumentVorlageExtendedDAO;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelector;
import de.ivu.elect.business.wahl.boundary.WahlterminSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.cdi.BeanManagerUtil;

/**
 *  on 12.01.2017.
 */
public abstract class AbstractDokumentvorlageKonfigurationSupplier<T> implements Supplier<T> {

  private final List<DokumentVorlageArt> dokumentVorlageArten;

  protected AbstractDokumentvorlageKonfigurationSupplier(List<DokumentVorlageArt> dokumentVorlageArten) {
    this.dokumentVorlageArten = dokumentVorlageArten;
  }

  protected List<DokumentVorlage> getDokumentVorlagen() {
    return findeVorlagenVonTyp(dokumentVorlageArten);
  }

  private List<DokumentVorlage> findeVorlagenVonTyp(List<DokumentVorlageArt> dokumentVorlageArten) {

    DokumentVorlageExtendedDAO dao = BeanManagerUtil.getBeanByClass(DokumentVorlageExtendedDAO.class);

    List<DokumentVorlage> result = new ArrayList<>();

    Wahl wahl = BeanManagerUtil.getBeanByClass(WahlSessionSelector.class).getEntity();
    if (wahl != null) {
      for (DokumentVorlageArt dokumentVorlageArt : dokumentVorlageArten) {
        result.addAll(dao.findByWahlAndArtOrderByName(wahl, dokumentVorlageArt));
      }
    } else {
      Wahltermin wahltermin = BeanManagerUtil.getBeanByClass(WahlterminSessionSelect.class).getEntity();
      if (wahltermin != null) {
        for (DokumentVorlageArt dokumentVorlageArt : dokumentVorlageArten) {
          result.addAll(dao.findByWahlterminAndArtOrderByName(wahltermin, dokumentVorlageArt));
        }
      }
    }
    return result;

  }
}
