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

import java.util.Optional;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.DefaultColumnEntry;
import de.ivu.elect.presentation.wahlvorschlag.table.WahlvorschlagStimmzettelPositionColumn;

public class KandidaturStimmzettelPositionColumn<E extends Kandidatur> extends AbstractKandidaturColumn<E> {

  private static final long serialVersionUID = 1L;

  public static final String HEADER_MSG_KEY = "kandidatur.position.stimmzettel";

  private final DefaultColumnEntry<Kandidatur> direktkandidaturStimmzettelPositionColumn;

  private final DefaultColumnEntry<Kandidatur> listenkandidaturStimmzettelPositionColumn;

  private final boolean iconPresent;

  public KandidaturStimmzettelPositionColumn(Messages messages, Icons icons, Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super("Kandidatur-Stimmzettel-Position", messages, HEADER_MSG_KEY, ColumnType.LONG, kandidatur -> null);

    this.direktkandidaturStimmzettelPositionColumn = new DirektkandidaturWahlvorschlagColumn<>(new WahlvorschlagStimmzettelPositionColumn<>(messages, icons, gebiet, entityAufStimmzettelDaten));
    this.listenkandidaturStimmzettelPositionColumn = new ListenkandidaturStimmzettelPositionColumn<>(messages, icons, gebiet, entityAufStimmzettelDaten);

    this.iconPresent = direktkandidaturStimmzettelPositionColumn.isIconPresent() || listenkandidaturStimmzettelPositionColumn.isIconPresent();
  }

  @Override
  public Object getDisplayValue(E kandidatur) {
    return getColumn(kandidatur).map(column -> column.getDisplayValue(kandidatur)).orElse(null);
  }

  @Override
  public Object getValue(E kandidatur) {
    return getColumn(kandidatur).map(column -> column.getValue(kandidatur)).orElse(null);
  }

  @Override
  public boolean isIconPresent() {
    return iconPresent;
  }

  @Override
  public boolean isIconRendered(E kandidatur) {
    return getColumn(kandidatur).map(column -> column.isIconRendered(kandidatur)).orElse(super.isIconRendered(kandidatur));
  }

  @Override
  public String getIcon(E kandidatur) {
    return getColumn(kandidatur).map(column -> column.getIcon(kandidatur)).orElse(super.getIcon(kandidatur));
  }

  @Override
  public String getTooltip(E kandidatur) {
    return getColumn(kandidatur).map(column -> column.getTooltip(kandidatur)).orElse(super.getTooltip(kandidatur));
  }

  private Optional<DefaultColumnEntry<Kandidatur>> getColumn(Kandidatur kandidatur) {
    if (isDirektkandidatur(kandidatur)) {
      return Optional.of(direktkandidaturStimmzettelPositionColumn);
    }

    if (isListenkandidatur(kandidatur)) {
      return Optional.of(listenkandidaturStimmzettelPositionColumn);
    }

    return Optional.empty();
  }

  private boolean isDirektkandidatur(Kandidatur kandidatur) {
    return kandidatur != null && kandidatur.isDirektkandidatur();
  }

  private boolean isListenkandidatur(Kandidatur kandidatur) {
    return kandidatur != null && kandidatur.isListenkandidatur();
  }
}
