
package de.ivu.elect.presentation.kandidatur.table;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.kandidatur.boundary.KandidaturExtendedDAO;
import de.ivu.elect.business.kandidatur.entity.DirektkandidaturKumulierteStimmen;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeStimmenartLabelGenerator;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;

@Named(DirektkandidaturKumulierteStimmenColumnBuilder.COMPONENT_NAME)
public class DirektkandidaturKumulierteStimmenColumnBuilder extends AbstractKandidaturKumulierteStimmenColumnBuilder<DirektkandidaturKumulierteStimmen> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "direktkandidaturKumulierteStimmenColumnBuilder";

  @Inject
  private transient KandidaturExtendedDAO kandidaturExtendedDAO;

  private KandidaturKumulierteStimmenAnzahlDirektstimmenColumn kandidaturKumulierteStimmenAnzahlDirektstimmenColumn;

  private KandidaturKumulierteStimmenGewaehltRangDirektstimmenColumn kandidaturKumulierteStimmenGewaehltRangDirektstimmenColumn;

  public DirektkandidaturKumulierteStimmenColumnBuilder() {
    super();
  }

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

    if (isGebietSelected() && isErgebnisSelected()) {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = getSelectedGebiet();

      boolean wahlMitDirektwahlgebietenSelected = isWahlMitDirektwahlgebietenSelected();
      boolean wahlMitListenwahlgebietenSelected = isWahlMitListenwahlgebietenSelected();

      boolean stimmenartenUnterscheiden = wahlMitDirektwahlgebietenSelected && wahlMitListenwahlgebietenSelected;

      StimmeingabeStimmenartLabelGenerator stimmenartLabelGenerator = getStimmenartLabelGenerator(wahldurchfuehrungsgebiet);

      kandidaturKumulierteStimmenAnzahlDirektstimmenColumn = new KandidaturKumulierteStimmenAnzahlDirektstimmenColumn(wahldurchfuehrungsgebiet, stimmenartenUnterscheiden, getMessages(),
          stimmenartLabelGenerator);

      if (isSitzberechnungsalgorithmusVergibtSitze()) {
        kandidaturKumulierteStimmenGewaehltRangDirektstimmenColumn = new KandidaturKumulierteStimmenGewaehltRangDirektstimmenColumn(wahldurchfuehrungsgebiet,
            getSelectedErgebnis(), getMessages(), kandidaturExtendedDAO);
      }
    }
  }

  @Override
  public List<ColumnEntry< ? super DirektkandidaturKumulierteStimmen>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super DirektkandidaturKumulierteStimmen>> result = new ArrayList<>(super.getColumnEntriesSorted());

    if (isErgebnisSelected()) {
      boolean sitzberechnungsalgorithmusVergibtSitze = isSitzberechnungsalgorithmusVergibtSitze();

      // Reihenfolge Stimmen/Rang/Stimmzettelposition, cf. KandidaturGewaehltColumnBuilder#getColumnEntriesSorted, ListenkandidaturKumulierteStimmenColumnBuilder#getColumnEntriesSorted!
      result.add(kandidaturKumulierteStimmenAnzahlDirektstimmenColumn);

      if (sitzberechnungsalgorithmusVergibtSitze) {
        result.add(kandidaturKumulierteStimmenGewaehltRangDirektstimmenColumn);
      }
    }

    return result;
  }
}
