package de.ivu.elect.presentation.gebietsbaum.chart;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.AWerteStatistik;
import de.ivu.elect.business.gebietsbaum.entity.AWerteStatistikResult;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.charts.PieChartModelBuilder;
import de.ivu.elect.presentation.charts.ChartColor;

@Specializes
public class WasGebietChartBuilder extends GebietChartBuilder {

  @Inject
  private transient Messages messages;

  @Inject
  private transient AWerteStatistik aWerteStatistik;

  @Inject
  private transient ChartColor chartColor;

  @Override
  public List<GebietChart> buildGebietCharts(Wahltermin wahltermin, Wahl wahl, Gebiet selectedGebiet) {
    List<GebietChart> result = new ArrayList<>(super.buildGebietCharts(wahltermin, wahl, selectedGebiet));

    buildAWerteChart(selectedGebiet).ifPresent(result::add);


    return result;
  }

  private Optional<GebietChart> buildAWerteChart(Gebiet selectedGebiet) {
    if (selectedGebiet==null){
      return Optional.empty();
    }
    AWerteStatistikResult aWerteStatistikResult = aWerteStatistik.bestimmeAWerteStatistik(selectedGebiet);
    PieChartModelBuilder modelBuilder = createPieChartModelBuilder();


    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.gebiete.insgesamt", aWerteStatistikResult::getAnzahlGebieteInsgesamt, chartColor.getFarbe(1));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.mit.a1", aWerteStatistikResult::getAnzahlA1Gesetzt, chartColor.getFarbe(2));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.mit.a2", aWerteStatistikResult::getAnzahlA2Gesetzt, chartColor.getFarbe(3));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.mit.a3", aWerteStatistikResult::getAnzahlA3Gesetzt, chartColor.getFarbe(4));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.ohne.a1", aWerteStatistikResult::getAnzahlA1NichtGesetzt, chartColor.getFarbe(0));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.ohne.a2", aWerteStatistikResult::getAnzahlA2NichtGesetzt, chartColor.getFarbe(7));
    addStatistik(modelBuilder, "gebiet.chart.a.werte.gebiete.ohne.a3", aWerteStatistikResult::getAnzahlA3NichtGesetzt, chartColor.getFarbe(6));

    GebietChart gebietChart = new GebietChart(messages.getMessageForMessageKey("gebiet.chart.a.werte"), modelBuilder.buildModel());
    return Optional.of(gebietChart);

  }

  private void addStatistik(PieChartModelBuilder modelBuilder, String mesgKey, Supplier<Long> getAnzahl, String farbe) {
    modelBuilder.add(messages.getMessageForMessageKey(mesgKey) + " - " + getAnzahl.get(), getAnzahl.get(), farbe);
  }

}
