
package de.ivu.elect.business.gruppe.control;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nonnull;

import de.ivu.elect.business.gruppe.boundary.GruppeNachErfassungsgebietStimmenSearchParameters;
import de.ivu.elect.business.gruppe.entity.GruppeKumulierteStimmen;
import de.ivu.elect.presentation.gruppe.table.AbstractGruppeKumulierteStimmenColumn;
import de.ivu.elect.presentation.gruppe.table.GruppeNachErfassungsgebietStimmenColumnBuilder;

public abstract class AbstractGruppeNachErfassungsgebietBuilder<T> implements Serializable {

  private static final long serialVersionUID = 1L;

  public AbstractGruppeNachErfassungsgebietBuilder() {
    super();
  }

  public T build(GruppeNachErfassungsgebietStimmenSearchParameters searchParameters, List<GruppeKumulierteStimmen> searchResult, GruppeNachErfassungsgebietStimmenColumnBuilder columnBuilder) {
    return buildInternal(searchParameters, searchResult, getDarzustellendeWerte(searchParameters, columnBuilder), columnBuilder);
  }

  protected abstract T buildInternal(GruppeNachErfassungsgebietStimmenSearchParameters searchParameters, List<GruppeKumulierteStimmen> searchResult,
      List<AbstractGruppeKumulierteStimmenColumn> darzustellendeWerte, GruppeNachErfassungsgebietStimmenColumnBuilder columnBuilder);

  @Nonnull
  protected List<AbstractGruppeKumulierteStimmenColumn> getDarzustellendeWerte(GruppeNachErfassungsgebietStimmenSearchParameters searchParameters,
      GruppeNachErfassungsgebietStimmenColumnBuilder columnBuilder) {
    List<AbstractGruppeKumulierteStimmenColumn> result = new ArrayList<>();

    for (String columnKey : searchParameters.getDarzustellendeWerteGrafisch()) {
      for (AbstractGruppeKumulierteStimmenColumn column : columnBuilder.collectColumnsContainingDarzustellendeWerteGrafisch()) {
        if (columnKey.equals(columnBuilder.getHeaderIgnoringErgebnisartFuerDifferenz(column))) {
          result.add(column);

          break;
        }
      }
    }

    return result;
  }

  protected boolean isProzentualeAngaben(List<AbstractGruppeKumulierteStimmenColumn> columns) {
    for (AbstractGruppeKumulierteStimmenColumn column : columns) {
      if (AbstractGruppeKumulierteStimmenColumn.STIMMEN_ANTEIL_COLUMN_TYPE.equals(column.getType())) {
        return true;
      }
    }

    return false;
  }
}
