
package de.ivu.elect.presentation.wahl;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.chart.PieChartModel;

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.presentation.stimmeingabe.status.ErgebniseingangErfassungsstatusPieChartModelBuilder;

@RequestScoped
@Named(ErfassungsfortschrittView.COMPONENT_NAME)
public class ErfassungsfortschrittView implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "erfassungsfortschrittView";

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Inject
  private transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect wahldurchfuehrungsgebietSessionSelect;

  @Inject
  private transient ErgebniseingangErfassungsstatusPieChartModelBuilder ergebniseingangErfassungsstatusPieChartModelBuilder;

  private transient Map<Ergebniseingabestufe, PieChartModel> erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet;

  private transient Map<Ergebniseingabestufe, PieChartModel> erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet;

  public ErfassungsfortschrittView() {
    super();
  }

  public Map<Ergebniseingabestufe, PieChartModel> getErfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet() {
    if (erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet == null) {
      erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet = new LinkedHashMap<>();

      Wahldurchfuehrung wahldurchfuehrung = wahldurchfuehrungSessionSelect.getEntity();

      if (wahldurchfuehrung != null) {
        fillInErfassungsstatusPieChartModelPerErgebniseingabestufeFuerGebiet(erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet, wahldurchfuehrung,
            wahldurchfuehrung.getWurzelgebiet(wahldurchfuehrungsgebietExtendedDAO), wahldurchfuehrung.getErgebniseingangsart());
      }
    }

    return erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet;
  }

  public Map<Ergebniseingabestufe, PieChartModel> getErfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet(Ergebniseingangsart ergebniseingangsart) {
    if (erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet == null) {
      erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet = new LinkedHashMap<>();

      fillInErfassungsstatusPieChartModelPerErgebniseingabestufeFuerGebiet(erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet, wahldurchfuehrungSessionSelect.getEntity(),
          wahldurchfuehrungsgebietSessionSelect.getEntity(), ergebniseingangsart);
    }

    return erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet;
  }

  protected void fillInErfassungsstatusPieChartModelPerErgebniseingabestufeFuerGebiet(Map<Ergebniseingabestufe, PieChartModel> result, Wahl wahl, Gebiet uebergeordnetesGebiet,
      Ergebniseingangsart ergebniseingangsart) {
    for (Ergebniseingabestufe ergebniseingabestufe : ergebniseingangErfassungsstatusPieChartModelBuilder.collectErgebniseingabestufen(wahl)) {
      result.put(ergebniseingabestufe, ergebniseingangErfassungsstatusPieChartModelBuilder.createPieChartModel(wahl, uebergeordnetesGebiet, ergebniseingangsart, ergebniseingabestufe));
    }
  }

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

  private void reset() {
    erfassungsstatusPieChartModelPerErgebniseingabestufeFuerWurzelgebiet = null;
    erfassungsstatusPieChartModelPerErgebniseingabestufeFuerAktuellesGebiet = null;
  }
}
