
package de.ivu.elect.presentation.wahlvorschlag;

import java.util.Map;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.chart.PieChartModel;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagStatusFuerStatusuebersicht;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagStatusuebersicht;
import de.ivu.elect.business.wahlvorschlag.entity.AbstractWahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.charts.PieChartModelBuilder;
import de.ivu.elect.presentation.AbstractElectStatusuebersichtView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahl.CurrentWahlZulassungspruefungExtended;

@OnlineHilfeId("682")
@RequestScoped
@Named(WahlvorschlagStatusuebersichtView.COMPONENT_NAME)
@View(viewId = WahlvorschlagStatusuebersichtView.VIEW_ID, useCase = UseCasePermission.WAHLVORSCHLAG_STATUSUEBERSICHT_ANZEIGEN)
public class WahlvorschlagStatusuebersichtView extends AbstractElectStatusuebersichtView<Wahlvorschlag> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlvorschlagStatusuebersichtView";

  public static final String VIEW_ID = "/wahlvorschlag/wahlvorschlag-statusuebersicht.xhtml";

  @Inject
  private transient WahlvorschlagStatusuebersicht wahlvorschlagStatusuebersicht;

  public WahlvorschlagStatusuebersichtView() {
    super();
  }

  @Inject
  private transient CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  private PieChartModel listeStatusPieChartModel;

  private PieChartModel listenkandidaturStatusPieChartModel;

  private PieChartModel direktStatusPieChartModel;

  private PieChartModel referendumStatusPieChartModel;

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!isWahlSelected() || !isGebietSelected()) {
      return getStartViewId();
    }

    return null;
  }

  @Override
  protected void fillStatusPieChartModel(PieChartModelBuilder modelBuilder) {
    fillModel(modelBuilder, wahlvorschlagStatusuebersicht.getAnzahlWahlvorschlaegeProStatus(getSelectedWahl(), getSelectedGebiet()));
  }

  private void fillModel(PieChartModelBuilder modelBuilder, Map<WahlvorschlagStatusFuerStatusuebersicht, Long> map) {
    if (currentWahlZulassungspruefung.isZulassungBearbeitbar()) {
      for (WahlvorschlagStatusFuerStatusuebersicht status : WahlvorschlagStatusFuerStatusuebersicht.values()) {
        Long anzahl = map.getOrDefault(status, 0L);

        modelBuilder.add(getMessage(status) + " - " + format(anzahl), anzahl, status.getColor());
      }
    } else {
      // ELECT-7397
      WahlvorschlagStatusFuerStatusuebersicht zugelassen = WahlvorschlagStatusFuerStatusuebersicht.ZUGELASSEN;
      Long anzahl = map.getOrDefault(zugelassen, 0L);

      modelBuilder.add(getMessage(zugelassen) + " - " + format(anzahl), anzahl, zugelassen.getColor());
    }

  }

  public boolean isDirektStatusRendered() {
    return getSelectedWahl() != null && getSelectedWahl().isWahlMitDirektkandidatengebieten();
  }

  public PieChartModel getDirektStatusPieChartModel() {
    if (direktStatusPieChartModel == null) {
      PieChartModelBuilder modelBuilder = createPieChartModelBuilder();
      fillModel(modelBuilder, wahlvorschlagStatusuebersicht.getAnzahlWahlvorschlaegeProStatus(getSelectedWahl(), getSelectedGebiet(), AbstractWahlvorschlag::isDirektkandidat));
      direktStatusPieChartModel = modelBuilder.buildModel();
    }

    return direktStatusPieChartModel;
  }

  public boolean isListeStatusRendered() {
    return getSelectedWahl() != null && getSelectedWahl().isWahlMitListengebieten();
  }

  public PieChartModel getListeStatusPieChartModel() {
    if (listeStatusPieChartModel == null) {
      PieChartModelBuilder modelBuilder = createPieChartModelBuilder();
      fillModel(modelBuilder, wahlvorschlagStatusuebersicht.getAnzahlWahlvorschlaegeProStatus(getSelectedWahl(), getSelectedGebiet(), AbstractWahlvorschlag::isListe));
      listeStatusPieChartModel = modelBuilder.buildModel();
    }

    return listeStatusPieChartModel;
  }

  public boolean isListenkandidatenStatusRendered() {
    return getSelectedWahl() != null && getSelectedWahl().isWahlMitListenkandidatenStimmen();
  }

  public PieChartModel getListenkandidatenStatusPieChartModel() {
    if (listenkandidaturStatusPieChartModel == null) {
      PieChartModelBuilder modelBuilder = createPieChartModelBuilder();
      fillModel(modelBuilder, wahlvorschlagStatusuebersicht.getAnzahlListenkandidaturenProStatus(getSelectedWahl(), getSelectedGebiet()));
      listenkandidaturStatusPieChartModel = modelBuilder.buildModel();
    }

    return listenkandidaturStatusPieChartModel;
  }

  public boolean isReferendumStatusRendered() {
    return getSelectedWahl() != null && getSelectedWahl().isWahlMitReferendengebieten();
  }

  public PieChartModel getRefrendumStatusPieChartModel() {
    if (referendumStatusPieChartModel == null) {
      PieChartModelBuilder modelBuilder = createPieChartModelBuilder();
      fillModel(modelBuilder, wahlvorschlagStatusuebersicht.getAnzahlWahlvorschlaegeProStatus(getSelectedWahl(), getSelectedGebiet(), AbstractWahlvorschlag::isReferendumOption));
      referendumStatusPieChartModel = modelBuilder.buildModel();
    }

    return referendumStatusPieChartModel;
  }

}
