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

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

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

import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisDatenCreatorExtended;
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.business.wahl.entity.WahlParameterWerte;
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;

  @Inject
  private transient ErgebnisDatenCreatorExtended ergebnisDatenCreatorExtended;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteOhneWahlscheinColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteMitWahlscheinColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteNichtImWaehlerverzeichnisColumn;

  private AbstractGebietColumn<Gebiet> anzahlWahlberechtigteGesamtColumn;

  private AnzahlWahlberechtigteColumn anzahlWahlberechtigteAbweichend;

  private ErgebnisDaten ergebnisDaten;

  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);

      if (ergebnisSessionSelect.isSelected()) {

        anzahlWahlberechtigteAbweichend = new AnzahlWahlberechtigteAbweichendColumn("Wahldurchfuehrungsgebiet-anzahlWahlberechtigteAbweichend", getMessages()
            , getIcons(),
            getMessage("anzahl.gebiete.wahlberechtigte.abweichend"),
            w -> getErgebnisDaten().gerErfassungsgebieteMitAbweichendenAWertenUnterhalbVon(w).size());

      }

    }
  }

  @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);
      if (ergebnisSessionSelect.isSelected()) {
        result.add(anzahlWahlberechtigteAbweichend);
      }
    }

    return result;
  }

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

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

  public ErgebnisDaten getErgebnisDaten() {
    if (ergebnisDaten == null) {
      return ergebnisDatenCreatorExtended.createErgebnisDaten(ergebnisSessionSelect.getEntity(), Collections.emptySet(),
          WahlParameterWerte.STIMMEN_LADEN_FUER_EXPORTE);
    }
    return ergebnisDaten;
  }
}
