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

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

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

import de.ivu.elect.business.statistik.entity.StatistikKennzeichen;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;

@Named(StatistikKennzeichenColumnBuilder.COMPONENT_NAME)
public class StatistikKennzeichenColumnBuilder extends AbstractColumnBuilder<StatistikKennzeichen> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "statistikKennzeichenColumnBuilder";

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  private AbstractStatistikKennzeichenColumn<StatistikKennzeichen> statistikKennzeichenKennzeichenColumn;

  private AbstractStatistikKennzeichenColumn<StatistikKennzeichen> statistikKennzeichenWertColumn;

  private AbstractStatistikKennzeichenColumn<StatistikKennzeichen> wahlColumn;

  private AbstractStatistikKennzeichenColumn<StatistikKennzeichen> gebietColumn;

  private AbstractStatistikKennzeichenColumn<StatistikKennzeichen> statistikKennzeichenQualifierColumn;

  public StatistikKennzeichenColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    statistikKennzeichenKennzeichenColumn = AbstractStatistikKennzeichenColumn.createStatistikKennzeichenKennzeichenColumn(getMessages());
    statistikKennzeichenWertColumn = AbstractStatistikKennzeichenColumn.createStatistikKennzeichenWertColumn(getMessages());
    wahlColumn = AbstractStatistikKennzeichenColumn.createWahlColumn(getMessages(), ColumnType.STRING,
        k -> Optional.ofNullable(k.getWahl()).map(Wahl::getWahlart).map(Wahlart::getName).orElse(getMessage("statistik.kennzeichen.wahl.keine")));
    gebietColumn = AbstractStatistikKennzeichenColumn.createGebietColumn(getMessages(), ColumnType.STRING, k -> {
      if (k.isPersistent()) {
        return Optional.ofNullable(k.getGebiet()).map(gebietNummerFormatter::getNameMitNummer).orElse("-");
      }
      return Optional.ofNullable(k.getGebiet()).map(gebietNummerFormatter::getNameMitNummer).map(name -> name + " " + getMessage("statistik.kennzeichen.gebiet.name.kumuliert")).orElse("-");
    });
    statistikKennzeichenQualifierColumn = AbstractStatistikKennzeichenColumn.createStatistikKennzeichenQualifierColumn(getMessages());
  }

  @Override
  protected List<ColumnEntry< ? super StatistikKennzeichen>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super StatistikKennzeichen>> result = new ArrayList<>();
    result.add(gebietColumn);
    result.add(wahlColumn);
    result.add(statistikKennzeichenKennzeichenColumn);
    result.add(statistikKennzeichenQualifierColumn);
    result.add(statistikKennzeichenWertColumn);

    return result;
  }
}
