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

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

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.boundary.StimmenExtendedDAO;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gruppe.entity.KopfzahlKumulierteStimmen;
import de.ivu.elect.business.gruppe.entity.SystemGruppeEigenschaften;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

public abstract class AbstractKopfzahlKumulierteStimmenColumnBuilder extends AbstractColumnBuilder<KopfzahlKumulierteStimmen> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  private transient StimmenExtendedDAO stimmenExtendedDAO;

  @Inject
  private transient SystemGruppeEigenschaften systemGruppeEigenschaften;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> kennungColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> bezeichnungColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> anzahlColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> anzahlErgebnisartFuerDifferenzColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> anteilColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> anteilErgebnisartFuerDifferenzColumn;

  protected AbstractColumnEntry<KopfzahlKumulierteStimmen> anteilDifferenzColumn;

  public AbstractKopfzahlKumulierteStimmenColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    kennungColumn = new KopfzahlKumulierteStimmenKennungColumn(getMessages(), systemGruppeEigenschaften);
    bezeichnungColumn = new KopfzahlKumulierteStimmenBezeichnungColumn(getMessages(), systemGruppeEigenschaften);

    anzahlColumn = new KopfzahlKumulierteStimmenAnzahlColumn(getMessages(), systemGruppeEigenschaften);
    anteilColumn = new KopfzahlKumulierteStimmenAnteilColumn(getMessages(), systemGruppeEigenschaften);

    anzahlErgebnisartFuerDifferenzColumn = new KopfzahlKumulierteStimmenAnzahlErgebnisartFuerDifferenzColumn(getMessages(), systemGruppeEigenschaften, getErgebnisartFuerDifferenz());
    anteilErgebnisartFuerDifferenzColumn = new KopfzahlKumulierteStimmenAnteilErgebnisartFuerDifferenzColumn(getMessages(), systemGruppeEigenschaften, getErgebnisartFuerDifferenz());

    anteilDifferenzColumn = new KopfzahlKumulierteStimmenAnteilDifferenzColumn(getMessages(), systemGruppeEigenschaften);
  }

  protected abstract Ergebnisart getErgebnisartFuerDifferenz();

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

    result.add(kennungColumn);
    result.add(bezeichnungColumn);

    result.add(anzahlColumn);
    result.add(anteilColumn);

    if (isErgebnisVorperiodeVorhanden()) {
      result.add(anzahlErgebnisartFuerDifferenzColumn);
      result.add(anteilErgebnisartFuerDifferenzColumn);

      result.add(anteilDifferenzColumn);
    }

    return result;
  }

  private boolean isErgebnisVorperiodeVorhanden() {
    return stimmenExtendedDAO.findByCountStimmenByWahlAndErgebnisart(getWahl(), Ergebnisart.VORPERIODE) > 0L;
  }

  private Wahl getWahl() {
    return wahlSessionSelect.getEntity();
  }
}
