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

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.table.AbstractColumnEntry;
import de.ivu.elect.presentation.verteilung.VerteilungBerechnenViewTeilnehmerErgebnis;
import de.ivu.elect.util.CaseAndDiacriticIgnoringComparator;

public abstract class AbstractVerteilungBerechnenViewVerteilungResultColumnBuilder extends AbstractColumnBuilder<VerteilungBerechnenViewTeilnehmerErgebnis> {

  private static final long serialVersionUID = 1L;

  private AbstractColumnEntry<VerteilungBerechnenViewTeilnehmerErgebnis> verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerLabelColumn;

  private AbstractColumnEntry<VerteilungBerechnenViewTeilnehmerErgebnis> verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerIsInLosverfahrenColumn;

  private AbstractColumnEntry<VerteilungBerechnenViewTeilnehmerErgebnis> verteilungBerechnenViewTeilnehmerErgebnisAnzahlStimmenColumn;

  private AbstractVerteilungBerechnenViewTeilnehmerErgebnisQuotientColumn verteilungBerechnenViewTeilnehmerErgebnisQuotientGemeinColumn;

  private AbstractVerteilungBerechnenViewTeilnehmerErgebnisQuotientColumn verteilungBerechnenViewTeilnehmerErgebnisQuotientDezimalColumn;

  private VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn verteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn;

  protected AbstractVerteilungBerechnenViewVerteilungResultColumnBuilder() {
    super();
  }

  @Override
  public boolean isColumnsSortableByValue() {
    return false;
  }

  @Override
  protected void initColumns() {
    verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerLabelColumn = new VerteilungBerechnenViewTeilnehmerErgebnisTeilnehmerLabelColumn(getMessages(), getLocale());
    verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerIsInLosverfahrenColumn = new VerteilungBerechnenViewTeilnehmerErgebnisTeilnehmerIsInLosverfahrenColumn(getMessages(), getLocale());

    verteilungBerechnenViewTeilnehmerErgebnisAnzahlStimmenColumn = new VerteilungBerechnenViewTeilnehmerErgebnisAnzahlStimmenColumn(getMessages(), getLocale());

    verteilungBerechnenViewTeilnehmerErgebnisQuotientGemeinColumn = createTeilnehmerErgebnisQuotientGemeinColumn();
    verteilungBerechnenViewTeilnehmerErgebnisQuotientDezimalColumn = createTeilnehmerErgebnisQuotientDezimalColumn();

    verteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn = new VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn(getMessages(), getLocale(), true);
  }

  protected abstract AbstractVerteilungBerechnenViewTeilnehmerErgebnisQuotientColumn createTeilnehmerErgebnisQuotientGemeinColumn();

  protected abstract AbstractVerteilungBerechnenViewTeilnehmerErgebnisQuotientColumn createTeilnehmerErgebnisQuotientDezimalColumn();

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

    result.add(verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerLabelColumn);
    result.add(verteilungBerechnenViewTeilnehmerErgebnisTeilnehmerIsInLosverfahrenColumn);

    result.add(verteilungBerechnenViewTeilnehmerErgebnisAnzahlStimmenColumn);

    result.add(verteilungBerechnenViewTeilnehmerErgebnisQuotientGemeinColumn);
    result.add(verteilungBerechnenViewTeilnehmerErgebnisQuotientDezimalColumn);

    result.add(verteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn);

    return result;
  }

  public List<String> collectColumnTooltips(List<VerteilungBerechnenViewTeilnehmerErgebnis> teilnehmerErgebnisse) {
    Set<String> tooltips = new HashSet<>();

    initIfNotInitialized();

    for (VerteilungBerechnenViewTeilnehmerErgebnis teilnehmerErgebnis : teilnehmerErgebnisse) {
      tooltips.addAll(verteilungBerechnenViewTeilnehmerErgebnisQuotientGemeinColumn.collectTooltips(teilnehmerErgebnis));
      tooltips.addAll(verteilungBerechnenViewTeilnehmerErgebnisQuotientDezimalColumn.collectTooltips(teilnehmerErgebnis));

      tooltips.addAll(verteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn.collectTooltips(teilnehmerErgebnis));
    }

    List<String> result = new ArrayList<>(tooltips);
    result.sort(CaseAndDiacriticIgnoringComparator.DEFAULT_INSTANCE);

    return result;
  }
}
