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

import java.util.Collection;
import java.util.Date;
import java.util.stream.Collectors;

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

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

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.GebietPK;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.control.ErgebniseingangEingangssequenznummerGenerator;
import de.ivu.elect.business.stimmeingabe.control.GeloeschteErgebniseingangEingangssequenznummerSpeichern;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsherkunft;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class StimmeingabeErfassungLoeschenExport {

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

  @Inject
  private transient WahldurchfuehrungsgebietDAO wahldurchfuehrungsgebietDAO;

  @Inject
  private transient ErgebniseingangEingangssequenznummerGenerator ergebniseingangEingangssequenznummerGenerator;

  @Inject
  private transient ErgebniseingangExporter ergebniseingangExporter;

  @Inject
  private transient GeloeschteErgebniseingangEingangssequenznummerSpeichern geloeschteErgebniseingangEingangssequenznummerSpeichern;

  public void export(Collection<GebietPK> gebiete, String geloeschtDurch, Ergebniseingangsart ergebniseingangsart) {
    exportiereGeloeschtenEingang(gebiete.stream().map(gebietPK -> wahldurchfuehrungsgebietDAO.findByPrimaryKey(gebietPK)).collect(Collectors.toList()),
        geloeschtDurch, ergebniseingangsart);
  }

  protected void exportiereGeloeschtenEingang(Collection<Wahldurchfuehrungsgebiet> ergebniseingaengeGeloeschtPerWahldurchfuehrungsgebiet,
                                              String geloeschtDurch, Ergebniseingangsart ergebniseingangsart) {
    final Long[] letzteGeloeschteEingangssequenznummer = {null};

    ergebniseingaengeGeloeschtPerWahldurchfuehrungsgebiet //
        .forEach(wahldurchfuehrungsgebiet -> {
          Long naechsteEingangssequenznummer = ergebniseingangEingangssequenznummerGenerator.getNaechsteEingangssequenznummer();

          letzteGeloeschteEingangssequenznummer[0] = naechsteEingangssequenznummer;

          // Gelöschter Ergebniseingang enthält keine Stimmeingaben, vergleiche de.ivu.elect.was.exchange.stimmeingabe.WasErgebniseingangXMLZIPExportMapper.
          Ergebniseingang ergebniseingangGeloescht = new Ergebniseingang();
          ergebniseingangGeloescht.setWahldurchfuehrungsgebiet(wahldurchfuehrungsgebiet);
          ergebniseingangGeloescht.setErfasser(geloeschtDurch);
          ergebniseingangGeloescht.setZeitstempel(new Date());
          ergebniseingangGeloescht.setEingangssequenznummer(naechsteEingangssequenznummer);
          ergebniseingangGeloescht.setErgebniseingangsart(ergebniseingangsart);
          ergebniseingangGeloescht.setErgebniseingangsherkunft(Ergebniseingangsherkunft.BENUTZER_EINGABE);
          ergebniseingangGeloescht.setGueltigKeinFehler();

          LOG.info("Lösche Ergebniseingänge - Ergebniseingang gelöscht - Eingangssequenznummer: " + naechsteEingangssequenznummer);

          ergebniseingangExporter.export(ergebniseingangGeloescht);
        });

    if (letzteGeloeschteEingangssequenznummer[0] != null) {
      geloeschteErgebniseingangEingangssequenznummerSpeichern.speichereEingangssequenznummerInKonfiguration();
    }
  }

}
