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

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

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.stimmzettel.boundary.StimmzettelKopfdatumExtendedDAO;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelKopfdatum;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelMeta;
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(StimmzettelKopfdatumColumnBuilder.COMPONENT_NAME)
public class StimmzettelKopfdatumColumnBuilder extends AbstractColumnBuilder<StimmzettelKopfdatum> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmzettelKopfdatumColumnBuilder";

  @Inject
  private transient StimmzettelMeta meta;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient StimmzettelKopfdatumExtendedDAO stimmzettelKopfdatumExtendedDAO;

  private StimmzettelKopfdatumGebietColumn<StimmzettelKopfdatum> wahldurchfuehrungsgebietColumn;

  private StimmzettelKopfdatumArtColumn stimmzettelKopfdatumArtColumn;

  private AbstractStimmzettelKopfdatumColumn<StimmzettelKopfdatum> stimmzettelKopfdatumWertColumn;

  private AbstractStimmzettelKopfdatumColumn<StimmzettelKopfdatum> gruppeColumn;

  @Override
  protected void initColumns() {
    wahldurchfuehrungsgebietColumn = new StimmzettelKopfdatumGebietColumn<>(getMessages(), gebietNummerFormatter);
    stimmzettelKopfdatumArtColumn = new StimmzettelKopfdatumArtColumn(getMessages());
    stimmzettelKopfdatumWertColumn = AbstractStimmzettelKopfdatumColumn.createStimmzettelKopfdatumWertColumn(getMessages());
    gruppeColumn = AbstractStimmzettelKopfdatumColumn
        .createGruppeColumn(getMessages(), ColumnType.STRING, x ->
        {
          Gruppe gruppe = stimmzettelKopfdatumExtendedDAO.attach(x).getGruppe();
          if (gruppe == null) {
            return "";
          }
          return gruppe.getName();
        });

  }

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

    if (!isErfassungsgebiet()) {
      ColumnEntry<? super StimmzettelKopfdatumColumnBuilder> wahldurchfuehrungsgebietColumn1;
      result.add(wahldurchfuehrungsgebietColumn);
    }

    result.add(stimmzettelKopfdatumArtColumn);
    result.add(stimmzettelKopfdatumWertColumn);
    result.add(gruppeColumn);
    return result;
  }

  private boolean isErfassungsgebiet() {
    return gebietSessionSelect.isSelected() && gebietSessionSelect.getEntity().isErfassungsgebiet();
  }

}
