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

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

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

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmen.boundary.KopfzahlLabelGenerator;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;

@Named(AnzahlWahlberechtigteColumnBuilder.COMPONENT_NAME)
public class AnzahlWahlberechtigteColumnBuilder extends AbstractColumnBuilder<Gebiet> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "anzahlWahlberechtigteColumnBuilder";

  @Inject
  private transient WahldurchfuehrungsgebietSessionSelect wahldurchfuehrungsgebietSessionSelect;

  @Inject
  private transient KopfzahlLabelGenerator kopfzahlLabelGenerator;

  @Inject
  private transient GebietColumnBuilderHelper gebietColumnBuilderHelper;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteOhneWahlscheinColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteMitWahlscheinColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteNichtImWaehlerverzeichnisColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteGesamtColumn;

  public AnzahlWahlberechtigteColumnBuilder() {
    super();
  }

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

    if (isWahldurchfuehrungsgebietSelected()) {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = getWahldurchfuehrungsgebiet();

      anzahlWahlberechtigteOhneWahlscheinColumn = new AnzahlWahlberechtigteColumn(
          AbstractWahldurchfuehrungsgebietColumn.createWahldurchfuehrungsgebietAnzahlWahlberechtigteOhneWahlscheinColumn(getMessages()),
          kopfzahlLabelGenerator.getAnzahlWahlberechtigteOhneWahlscheinBezeichnung(wahldurchfuehrungsgebiet));
      anzahlWahlberechtigteMitWahlscheinColumn = new AnzahlWahlberechtigteColumn(
          AbstractWahldurchfuehrungsgebietColumn.createWahldurchfuehrungsgebietAnzahlWahlberechtigteMitWahlscheinColumn(getMessages()),
          kopfzahlLabelGenerator.getAnzahlWahlberechtigteMitWahlscheinBezeichnung(wahldurchfuehrungsgebiet));
      anzahlWahlberechtigteNichtImWaehlerverzeichnisColumn = new AnzahlWahlberechtigteColumn(
          AbstractWahldurchfuehrungsgebietColumn.createWahldurchfuehrungsgebietAnzahlWahlberechtigteNichtImWaehlerverzeichnisColumn(getMessages()),
          kopfzahlLabelGenerator.getAnzahlWahlberechtigteNichtImWaehlerverzeichnisBezeichnung(wahldurchfuehrungsgebiet));
      anzahlWahlberechtigteGesamtColumn = new AnzahlWahlberechtigteColumn("Wahldurchfuehrungsgebiet-AnzahlWahlberechtigteGesamt", getMessages(),
          kopfzahlLabelGenerator.getAnzahlWahlberechtigteGesamtBezeichnung(wahldurchfuehrungsgebiet), Wahldurchfuehrungsgebiet::getAnzahlWahlberechtigterGesamtA1A2A3);
    }
  }

  @Override
  protected List<ColumnEntry< ? super Gebiet>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Gebiet>> result = new ArrayList<>();

    List<ColumnEntry< ? super Gebiet>> columnEntriesBasisinformationen = new ArrayList<>();
    gebietColumnBuilderHelper.addColumnEntriesBasisinformationen(columnEntriesBasisinformationen);

    for (ColumnEntry< ? super Gebiet> columnEntry : columnEntriesBasisinformationen) {
      result.add(columnEntry);
    }

    if (isWahldurchfuehrungsgebietSelected()) {
      result.add(anzahlWahlberechtigteGesamtColumn);
      result.add(anzahlWahlberechtigteOhneWahlscheinColumn);
      result.add(anzahlWahlberechtigteMitWahlscheinColumn);
      result.add(anzahlWahlberechtigteNichtImWaehlerverzeichnisColumn);
    }

    return result;
  }

  private boolean isWahldurchfuehrungsgebietSelected() {
    return wahldurchfuehrungsgebietSessionSelect.isSelected();
  }

  private Wahldurchfuehrungsgebiet getWahldurchfuehrungsgebiet() {
    return wahldurchfuehrungsgebietSessionSelect.getEntity();
  }
}
