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

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.jee.entity.EagerLoading;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

public abstract class AbstractKandidaturGewaehltColumn extends AbstractColumnEntry<Kandidatur> {

  private static final long serialVersionUID = 1L;

  public AbstractKandidaturGewaehltColumn(Messages messages) {
    super(messages);
  }

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

  @Override
  public String getHeader() {
    return getMessage("entity.einzahl.GEWAEHLT." + getErgebnisart().name());
  }

  @Override
  public Object getValue(Kandidatur entity) {
    for (Gewaehlt gewaehlt : entity.getGewaehlteByErgebnisart(getErgebnisart())) {
      return gewaehlt.getIstGewaehlt();
    }

    return Boolean.FALSE;
  }

  @Override
  public EagerLoading<Kandidatur> getEagerLoading() {
    EagerLoading<Kandidatur> defaultEagerLoading = super.getEagerLoading();

    return kandidatur -> {
      if (defaultEagerLoading != null) {
        defaultEagerLoading.eagerLoad(kandidatur);

        for (Ersatzkandidatur ersatzkandidatur : kandidatur.getUntergeordneteErsatzkandidaturen()) {
          defaultEagerLoading.eagerLoad(ersatzkandidatur);
        }
      }

      return kandidatur;
    };
  }

  protected abstract Ergebnisart getErgebnisart();
}
