package de.ivu.elect.was.exchange.wahl;

import de.ivu.elect.business.mandant.boundary.MandantDAO;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.business.wahl.entity.WahlStatus;
import de.ivu.elect.exchange.wahl.SystemWahlterminExportKonfiguration;
import de.ivu.elect.exchange.wahl.SystemWahlterminExportTransaktion;
import org.apache.commons.lang3.time.DateUtils;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;

@Stateless
@Specializes
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class WasSystemWahlterminExportTransaktion extends SystemWahlterminExportTransaktion {

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient MandantDAO mandantDAO;

  @Inject
 private transient AutomatischerWahlExport automatischerWahlExport;

  @Override
  public List<WahlPK> bestimmeZuExportierendeWahlen(SystemWahlterminExportKonfiguration systemWahlterminExportKonfiguration) {
    List<WahlPK> result = new ArrayList<>(super.bestimmeZuExportierendeWahlen(systemWahlterminExportKonfiguration));
    for (Mandant mandant : mandantDAO.findByAll()) {
      for (Wahl wahl : wahlDAO.findByStatus(mandant, WahlStatus.INITIAL)) {
        if (DateUtils.isSameDay(systemWahlterminExportKonfiguration.getWahldatum(), wahl.getWahldatum())) {
          result.add(wahl.getPk());
        }
      }
    }
    return result;
  }

  @Override
  public void exportiere(WahlPK wahlPK, SystemWahlterminExportKonfiguration systemWahlterminExportKonfiguration) {
    Wahl wahl = wahlDAO.findByPrimaryKey(wahlPK);
    automatischerWahlExport.exportiere(wahl, bestimmeZielVerzeichnis(wahl.getMandant(), systemWahlterminExportKonfiguration));
  }
}
