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

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

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

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonPoolSearchResultEntry;
import de.ivu.elect.jee.faces.Messages;
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.person.PersonendatenFormatter;
import de.ivu.elect.presentation.person.table.AbstractPersonendatenColumn;
import de.ivu.elect.presentation.person.table.PersonendatenVornamenAnzeigeColumn;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

@Named(WahlvorschlagsPersonPoolSearchResultEntryColumnBuilder.COMPONENT_NAME)
public class WahlvorschlagsPersonPoolSearchResultEntryColumnBuilder extends AbstractColumnBuilder<WahlvorschlagsPersonPoolSearchResultEntry> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlvorschlagsPersonPoolSearchResultEntryColumnBuilder";

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  private WahlvorschlagsPersonPoolSearchResultEntryColumnEntry wahlvorschlagsPersonOrdnungsmerkmalColumn;

  private WahlvorschlagsPersonPoolSearchResultEntryColumnEntry wahlvorschlagsPersonFamiliennameColumn;

  private WahlvorschlagsPersonPoolSearchResultEntryColumnEntry wahlvorschlagsPersonVornamenColumn;

  private WahlvorschlagsPersonPoolSearchResultEntryColumnEntry wahlvorschlagsPersonGeschlechtColumn;

  private WahlvorschlagsPersonPoolSearchResultEntryColumnEntry wahlvorschlagsPersonGeburtsdatumColumn;

  private WahlvorschlagsPersonPoolSearchResultEntryWahlvorschlagsPersonTypPerGruppeColumn wahlvorschlagsPersonSearchResultEntryWahlvorschlagsPersonTypPerGruppeColumn;

  public WahlvorschlagsPersonPoolSearchResultEntryColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    wahlvorschlagsPersonOrdnungsmerkmalColumn = new WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(getMessages(),
        AbstractPersonendatenColumn.createPersonendatenExternesOrdnungsmerkmalColumn(getMessages()));
    wahlvorschlagsPersonFamiliennameColumn = new WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(getMessages(), AbstractPersonendatenColumn.createPersonendatenFamiliennameColumn(getMessages()));
    wahlvorschlagsPersonVornamenColumn = new WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(getMessages(), new PersonendatenVornamenAnzeigeColumn<>(getMessages(), personendatenFormatter));
    wahlvorschlagsPersonGeschlechtColumn = new WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(getMessages(), AbstractPersonendatenColumn.createPersonendatenGeschlechtColumn(getMessages()));
    wahlvorschlagsPersonGeburtsdatumColumn = new WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(getMessages(), AbstractPersonendatenColumn.createPersonendatenGeburtsdatumColumn(getMessages()));

    wahlvorschlagsPersonSearchResultEntryWahlvorschlagsPersonTypPerGruppeColumn = new WahlvorschlagsPersonPoolSearchResultEntryWahlvorschlagsPersonTypPerGruppeColumn(getMessages());
  }

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

    result.add(wahlvorschlagsPersonOrdnungsmerkmalColumn);
    result.add(wahlvorschlagsPersonFamiliennameColumn);
    result.add(wahlvorschlagsPersonVornamenColumn);
    result.add(wahlvorschlagsPersonGeschlechtColumn);
    result.add(wahlvorschlagsPersonGeburtsdatumColumn);

    result.add(wahlvorschlagsPersonSearchResultEntryWahlvorschlagsPersonTypPerGruppeColumn);

    return result;
  }

  public class WahlvorschlagsPersonPoolSearchResultEntryColumnEntry extends AbstractColumnEntry<WahlvorschlagsPersonPoolSearchResultEntry> {

    private static final long serialVersionUID = 1L;

    private final AbstractColumnEntry<Personendaten> column;

    public WahlvorschlagsPersonPoolSearchResultEntryColumnEntry(Messages messages, AbstractColumnEntry<Personendaten> column) {
      super(messages);

      this.column = column;
    }

    @Override
    public ColumnType getType() {
      return column.getType();
    }

    @Override
    public String getHeader() {
      return column.getHeader();
    }

    @Override
    public Object getValue(WahlvorschlagsPersonPoolSearchResultEntry entry) {
      if (entry != null) {
        return column.getDisplayValue(entry.getTemplate());
      }

      return "";
    }
  }
}
