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

import java.util.List;

import javax.annotation.Nullable;
import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

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

import de.ivu.elect.business.ergebnis.boundary.ErgebnisDAO;
import de.ivu.elect.business.ergebnis.boundary.Ergebnisberechnung;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.kandidatur.control.NlListenkandidaturSynchronisieren;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;

@Stateless
@Specializes
public class NlWasListenkandidaturEdit extends ListenkandidaturEdit {

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

  @Inject
  private transient NlListenkandidaturSynchronisieren nlListenkandidaturSynchronisieren;

  @Inject
  private transient Ergebnisberechnung ergebnisberechnung;

  @Inject
  private transient ErgebnisDAO ergebnisDAO;

  public NlWasListenkandidaturEdit() {
    super();
  }

  //  ELECT-10328 Fraglich, ob notwendig...
  //  @Inject
  //  private transient NlListenkandidaturSynchronisierenEvent nlListenkandidaturSynchronisierenEvent;
  //
  //  @Override
  //  public void save(Listenkandidatur listenkandidatur) {
  //    super.save(listenkandidatur);
  //    nlListenkandidaturSynchronisierenEvent.sendeSynchronisierenEvent(listenkandidatur, false);
  //  }
  //

  @Override
  public void setStatus(Listenkandidatur template, KandidaturStatus kandidaturStatus, String kandidaturStatusBemerkung) {
    super.setStatus(template, kandidaturStatus, kandidaturStatusBemerkung);

    // ELECT-10321
    Listenkandidatur listenkandidatur = getAttachedEntity(template);

    nlListenkandidaturSynchronisieren.synchronisiereVerknuepftePersonen(listenkandidatur, true /* Es gibt nur "Verstorben" und das ist ohne Zweifel zu synchronisieren... */,
        false /* Positionen bleiben im WAS definitiv erhalten... */, false /* Kein Personenregister im WAS... */);

    // ELECT-10329
    Ergebnis ergebnis = findeErgebnis(listenkandidatur);

    if (ergebnis == null) {
      LOG.warn("Kein Ergebnis gefunden: " + listenkandidatur);
    } else {
      ergebnisberechnung.ergebnisBerechnenAusloesenOhneUebernahme(ergebnis);
    }
  }

  @Nullable
  private Ergebnis findeErgebnis(Listenkandidatur listenkandidatur) {
    Wahl wahl = listenkandidatur.getWahl();

    if (wahl == null) {
      return null;
    }

    List<Ergebnis> ergebnisse = ergebnisDAO.findByWahlAndErgebnisart(wahl, wahl.castTo(Wahldurchfuehrung.class).getEntity().getErgebniseingangsart().korrespondierendeErgebnisart());

    if (ergebnisse.isEmpty()) {
      return null;
    }

    return ergebnisse.get(0);
  }
}
