
package de.ivu.elect.presentation.stimmeingabe;

import java.io.Serializable;

import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisExtendedDAO;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungExtendedDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminSelectChangeEvent;
import de.ivu.elect.business.wahl.entity.Wahl;

/**
 * ELECTKOM-27
 */
@ViewAccessScoped
public class StimmeingabeErfassenViewErgebniseingangsartStore implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient ErgebnisExtendedDAO ergebnisExtendedDAO;

  @Inject
  protected transient WahldurchfuehrungExtendedDAO wahldurchfuehrungExtendedDAO;

  private Ergebniseingangsart ergebniseingangsart;

  public Ergebniseingangsart getErgebniseingangsart(Wahl wahl) {
    if (ergebniseingangsart == null) {
      return getErgebniseingangsartAnWahlDirekt(wahl);
    }

    return ergebniseingangsart;
  }

  public void setErgebniseingangsart(Ergebniseingangsart ergebniseingangsart) {
    this.ergebniseingangsart = ergebniseingangsart;
  }

  private Ergebniseingangsart getErgebniseingangsartAnWahlDirekt(Wahl wahl) {
    return wahldurchfuehrungExtendedDAO.findByPrimaryKey(wahl.getPk()).getErgebniseingangsart();
  }

  public Ergebnis getSelectedErgebnis() {
    Ergebnis ergebnis = ergebnisSessionSelect.getEntity();

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

    if (ergebniseingangsart == null || ergebniseingangsart.korrespondierendeErgebnisart().equals(ergebnis.getErgebnisart())) {
      return ergebnis;
    }

    return ergebnisExtendedDAO.findByWahlAndErgebnisart(ergebnis.getWahl(), ergebniseingangsart.korrespondierendeErgebnisart()).stream().findFirst().orElse(null);
  }

  public boolean isErgebniseingangsartVerschiedenVonWahl(Wahl wahl) {
    return ergebniseingangsart != null && !ergebniseingangsart.equals(getErgebniseingangsartAnWahlDirekt(wahl));
  }

  public void ergebniseEingangsartWechseln(Wahl wahl) {
    setErgebniseingangsart(getErgebniseingangsart(wahl).getArtNachWechsel());
  }

  public void reset() {
    ergebniseingangsart = null;
  }

  public void onWahlSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) WahlSelectChangeEvent event) {
    reset();
  }

  public void onWahlterminSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) WahlterminSelectChangeEvent event) {
    reset();
  }
}
