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

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

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

import org.apache.deltaspike.core.api.scope.ConversationGroup;

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.business.gruppe.boundary.GruppeNachErfassungsgebietStimmenSearchParameters;
import de.ivu.elect.business.gruppe.entity.GruppeConstants;
import de.ivu.elect.business.gruppe.entity.GruppeKumulierteStimmen;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnGroup;
import de.ivu.elect.presentation.gebietsbaum.tree.GebietsbaumTreeNodeIconResolver;

@Named(GruppeNachErfassungsgebietStimmenColumnBuilder.COMPONENT_NAME)
public class GruppeNachErfassungsgebietStimmenColumnBuilder extends AbstractGruppeStimmenColumnBuilder {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gruppeNachErfassungsgebietStimmenColumnBuilder";

  @Inject
  private transient GebietsbaumTreeNodeIconResolver gebietsbaumTreeNodeIconResolver;

  @Inject
  @ConversationGroup(GruppeNachErfassungsgebietStimmenSearchParameters.class)
  private transient GruppeNachErfassungsgebietStimmenSearchParameters searchParameters;

  private AbstractGruppeKumulierteStimmenColumn gebietArtColumn;

  private AbstractGruppeKumulierteStimmenColumn gebietNummerColumn;

  private AbstractGruppeKumulierteStimmenColumn gebietNameColumn;

  private ColumnGroup<GruppeKumulierteStimmen> gruppeGroup;

  private ColumnGroup<GruppeKumulierteStimmen> gebietGroup;

  public GruppeNachErfassungsgebietStimmenColumnBuilder() {
    super();
  }

  @Override
  protected boolean isColumnsDifferenzRendered() {
    return isErgebnisSelected(); // ELECT-9390, Spalten für Differenz IMMER initial anzeigen!
  }

  @Override
  protected void initColumns() {
    gebietArtColumn = new GruppeKumulierteStimmenGebietArtColumn(getMessages(), gebietsbaumTreeNodeIconResolver);
    gebietNummerColumn = new GruppeKumulierteStimmenGebietNummerColumn(getMessages());
    gebietNameColumn = new GruppeKumulierteStimmenGebietNameColumn(getMessages());

    super.initColumns();
  }

  @Override
  protected void initColumnGroups() {
    gruppeGroup = new ColumnGroup<>(getMessage(GruppeConstants.MESSAGE_KEY_ENTITY_EINZAHL));
    gruppeGroup.addColumn(gruppenFarbeColumn);
    gruppeGroup.addColumn(gruppenNameColumn);

    gebietGroup = new ColumnGroup<>(getMessage(GebietConstants.MESSAGE_KEY_ENTITY_EINZAHL));
    gebietGroup.addColumn(gebietArtColumn);
    gebietGroup.addColumn(gebietNummerColumn);
    gebietGroup.addColumn(gebietNameColumn);

    super.initColumnGroups();
  }

  @Override
  protected void resetState() {
    super.resetState();
  }

  @Override
  protected List<ColumnGroup< ? super GruppeKumulierteStimmen>> getColumnGroupsSorted() {
    List<ColumnGroup< ? super GruppeKumulierteStimmen>> result = new ArrayList<>();

    result.add(gruppeGroup);
    result.add(gebietGroup);
    result.addAll(super.getColumnGroupsSorted());

    return result;
  }

  @Override
  protected Ergebnisart getErgebnisartFuerDifferenz() {
    return searchParameters.getErgebnisartFuerDifferenz();
  }

  public ColumnEntry getGruppenFarbeColumn() {
    initIfNotInitialized();

    return gruppenFarbeColumn;
  }

  public ColumnEntry getGruppenNameColumn() {
    initIfNotInitialized();

    return gruppenNameColumn;
  }

  public ColumnEntry getGebietNameColumn() {
    initIfNotInitialized();

    return gebietNameColumn;
  }
}
