
package de.ivu.elect.presentation.gebietsbaum;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietStatusuebersicht;
import de.ivu.elect.business.gebietsbaum.boundary.GebietsartExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartPK;
import de.ivu.elect.business.security.UseCasePermission;
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.charts.ChartColor;
import de.ivu.elect.presentation.gebietsbaum.chart.GebietChart;
import de.ivu.elect.presentation.gebietsbaum.chart.GebietChartBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;


import static org.apache.commons.lang3.StringUtils.defaultIfBlank;

@OnlineHilfeId("649")
@RequestScoped
@Named(GebietStatusuebersichtView.COMPONENT_NAME)
@View(viewId = GebietStatusuebersichtView.VIEW_ID, useCase = UseCasePermission.GEBIET_STATUSUEBERSICHT_ANZEIGEN)
public class GebietStatusuebersichtView extends AbstractElectStatusuebersichtView<Gebiet> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gebietStatusuebersichtView";

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

  @Inject
  private transient GebietStatusuebersicht gebietStatusuebersicht;

  @Inject
  private transient GebietsartExtendedDAO gebietsartExtendedDAO;

  @Inject
  private transient GebietChartBuilder gebietChartBuilder;

  @Inject
  private transient ChartColor chartColor;

  private List<GebietChart> gebietCharts;

  public GebietStatusuebersichtView() {
    super();
  }

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

    return null;
  }

  @Override
  protected void fillStatusPieChartModel(PieChartModelBuilder modelBuilder) {
    List<Gebietsart> gebietsarten = gebietsartExtendedDAO.findByAll(getMandant()).stream() //
        .sorted(Comparator.comparing(Gebietsart::getPosition)) // ELECT-5428
        .collect(Collectors.toList());

    Map<GebietsartPK, Long> anzahlGebietePerGebietsart = gebietStatusuebersicht.getAnzahlGebieteProArt(getSelectedWahltermin(), getSelectedWahl(), getSelectedGebiet());
    Map<Gebietsart, String> farbePerGebietsart = chartColor.bestimmeFarben(gebietsarten);

    for (Gebietsart gebietsart : gebietsarten) {
      String label = defaultIfBlank(gebietsart.getGebietsartTitle(), gebietsart.getGebietsartName());
      Long anzahl = anzahlGebietePerGebietsart.getOrDefault(gebietsart.getPk(), 0L);

      modelBuilder.add(label + " - " + format(anzahl), anzahl, farbePerGebietsart.get(gebietsart));
    }
  }

  public List<GebietChart> getGebietCharts() {
    if (gebietCharts == null) {
      gebietCharts = buildGebietsCharts();
    }

    return gebietCharts;
  }

  private List<GebietChart> buildGebietsCharts() {
    return gebietChartBuilder.buildGebietCharts(getSelectedWahltermin(), getSelectedWahl(), getSelectedGebiet());
  }

  @Override
  protected void resetModel() {
    super.resetModel();

    gebietCharts = null;
  }
}
