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

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

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

import de.ivu.elect.business.ergebnis.entity.GewinnerUnterlegenerStimmendifferenzSearchResult;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.gruppe.table.AbstractGruppeColumn;
import de.ivu.elect.presentation.table.ColorColumnEntryWrapper;

@Named(GewinnerUnterlegenerStimmendifferenzColumnBuilder.COMPONENT_NAME)
public class GewinnerUnterlegenerStimmendifferenzColumnBuilder extends AbstractColumnBuilder<GewinnerUnterlegenerStimmendifferenzSearchResult> {

  public static final String COMPONENT_NAME = "gewinnerUnterlegenerStimmendifferenzColumnBuilder";

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient StimmzettelFormatter stimmzettelFormatter;

  private GewinnerUnterlegenerStimmendifferenzGebietColumn gebietColumn;

  private GewinnerUnterlegenerStimmendifferenzBewerberColumn ersterColumn;

  private GewinnerUnterlegenerStimmendifferenzBewerberColumn zweiterColumn;

  private GewinnerUnterlegenerStimmendifferenzGruppeFarbeColumn ersterGruppeFarbeColumn;
  private GewinnerUnterlegenerStimmendifferenzGruppeFarbeColumn zweiterGruppeFarbeColumn;

  private GewinnerUnterlegenerStimmendifferenzGruppeNameColumn ersterGruppeNameColumn;
  private GewinnerUnterlegenerStimmendifferenzGruppeNameColumn zweiterGruppeNameColumn;

  private GewinnerUnterlegenerStimmendifferenzStimmenColumn gueltigeStimmenColumn;
  private GewinnerUnterlegenerStimmendifferenzStimmenColumn ersterStimmenColumn;
  private GewinnerUnterlegenerStimmendifferenzStimmenColumn zweiterStimmenColumn;
  private GewinnerUnterlegenerStimmendifferenzAbsolutColumn absolutColumn;

  private GewinnerUnterlegenerStimmendifferenzAnteilColumn ersterAnteil;
  private GewinnerUnterlegenerStimmendifferenzAnteilColumn zweiterAnteil;

  private GewinnerUnterlegenerStimmendifferenzRelativColumn relativColumn;

  public GewinnerUnterlegenerStimmendifferenzColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    gebietColumn = new GewinnerUnterlegenerStimmendifferenzGebietColumn(getMessages(), gebietNummerFormatter);
    ersterColumn = new GewinnerUnterlegenerStimmendifferenzBewerberColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getErster, "gewinner.unterlegener.stimmendifferenz.erster", getMessages(),
        stimmzettelFormatter);
    zweiterColumn = new GewinnerUnterlegenerStimmendifferenzBewerberColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getZweiter, "gewinner.unterlegener.stimmendifferenz.zweiter",
        getMessages(), stimmzettelFormatter);
    ColorColumnEntryWrapper<Gruppe> farbeColumn = ColorColumnEntryWrapper.wrap(AbstractGruppeColumn.createGruppeFarbeColumn(getMessages()));
    ersterGruppeFarbeColumn = new GewinnerUnterlegenerStimmendifferenzGruppeFarbeColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getErster, getMessages(), farbeColumn);
    zweiterGruppeFarbeColumn = new GewinnerUnterlegenerStimmendifferenzGruppeFarbeColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getZweiter, getMessages(), farbeColumn);
    ersterGruppeNameColumn = new GewinnerUnterlegenerStimmendifferenzGruppeNameColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getErster, getMessages());
    zweiterGruppeNameColumn = new GewinnerUnterlegenerStimmendifferenzGruppeNameColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getZweiter, getMessages());
    gueltigeStimmenColumn = new GewinnerUnterlegenerStimmendifferenzStimmenColumn("gewinner.unterlegener.stimmendifferenz.stimmen.gueltige",
        GewinnerUnterlegenerStimmendifferenzSearchResult::getAnzahlStimmenInsgesamt, getMessages());
    ersterStimmenColumn = new GewinnerUnterlegenerStimmendifferenzStimmenColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getAnzahlStimmenErster, getMessages());
    zweiterStimmenColumn = new GewinnerUnterlegenerStimmendifferenzStimmenColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getAnzahlStimmenZweiter, getMessages());
    absolutColumn = new GewinnerUnterlegenerStimmendifferenzAbsolutColumn(getMessages());

    ersterAnteil = new GewinnerUnterlegenerStimmendifferenzAnteilColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getAnzahlStimmenErster, getMessages());
    zweiterAnteil = new GewinnerUnterlegenerStimmendifferenzAnteilColumn(GewinnerUnterlegenerStimmendifferenzSearchResult::getAnzahlStimmenZweiter, getMessages());
    relativColumn = new GewinnerUnterlegenerStimmendifferenzRelativColumn(getMessages());
  }

  @Override
  protected List<ColumnEntry< ? super GewinnerUnterlegenerStimmendifferenzSearchResult>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super GewinnerUnterlegenerStimmendifferenzSearchResult>> result = new ArrayList<>();
    result.add(gebietColumn);
    result.add(gueltigeStimmenColumn);
    result.add(ersterGruppeFarbeColumn);
    result.add(ersterGruppeNameColumn);
    result.add(ersterColumn);
    result.add(ersterStimmenColumn);
    result.add(ersterAnteil);
    result.add(zweiterGruppeFarbeColumn);
    result.add(zweiterGruppeNameColumn);
    result.add(zweiterColumn);
    result.add(zweiterStimmenColumn);
    result.add(zweiterAnteil);
    result.add(absolutColumn);
    result.add(relativColumn);

    return result;
  }
}
