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

import javax.annotation.Nullable;
import javax.el.MethodExpression;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.entity.AbstractEagerLoading;
import de.ivu.elect.jee.entity.EagerLoading;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.DefaultColumnEntry;
import de.ivu.elect.presentation.wahlvorschlag.table.AbstractWahlvorschlagColumn;

public class DirektkandidaturWahlvorschlagColumn<E extends Kandidatur> extends DefaultColumnEntry<E> {

  private static final long serialVersionUID = 1L;

  private final AbstractWahlvorschlagColumn< ? super Wahlvorschlag> column;

  public DirektkandidaturWahlvorschlagColumn(AbstractWahlvorschlagColumn< ? super Wahlvorschlag> column) {
    super("Direktkandidatur-" + column.getId(), column.getMessages(), column.getHeaderKey(), column.getType(), kandidatur -> null);

    this.column = column;
  }

  @Override
  public Object getDisplayValue(Kandidatur kandidatur) {
    // NOTE, dass auch Ersatzkandidaturen zu Direktkandidaturen angezeigt werden, für die die Wahlvorschlag Properties nicht (nochmalig) angezeigt werden sollen!
    if (isDirektkandidatur(kandidatur)) {
      return column.getDisplayValue(kandidatur.getWahlvorschlag());
    }
    if (column.getType().isBoolean()) {
      return null; // sonst funktioniert der Export der Tabelle nicht (ELECTKOM-3089)
    }
    return "";
  }

  @Override
  public Object getValue(Kandidatur kandidatur) {
    if (isDirektkandidatur(kandidatur)) {
      return column.getValue(kandidatur.getWahlvorschlag());
    }

    return "";
  }

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

  @Override
  public boolean hasSortByValueComparator() {
    return column.hasSortByValueComparator();
  }

  @Override
  public MethodExpression getSortByValueComparatorMethodExpression() {
    return column.getSortByValueComparatorMethodExpression();
  }

  @Override
  public Object getSortByValue(Kandidatur kandidatur) {
    return getDisplayValue(kandidatur);
  }

  @Override
  public boolean isRendered() {
    return column.isRendered();
  }

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

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

  @Override
  public Integer getWidth() {
    return column.getWidth();
  }

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

  @Override
  public String getStyleClass(Kandidatur kandidatur) {
    if (kandidatur != null) {
      return column.getStyleClass(kandidatur.getWahlvorschlag());
    }

    return column.getStyleClass(null);
  }

  @Override
  public String getStyleClass() {
    return null;
  }

  @Override
  public boolean isTypePresentString() {
    return column.isTypePresentString();
  }

  @Override
  public boolean isTypePresentBild() {
    return column.isTypePresentBild();
  }

  @Override
  public boolean isTypePresentLong() {
    return column.isTypePresentLong();
  }

  @Override
  public boolean isTypePresentDecimalOneFractionDigit() {
    return column.isTypePresentDecimalOneFractionDigit();
  }

  @Override
  public boolean isTypePresentDecimalOneFractionDigitPercentage() {
    return column.isTypePresentDecimalOneFractionDigitPercentage();
  }

  @Override
  public boolean isTypePresentDecimalOneFractionDigitPercentagePoints() {
    return column.isTypePresentDecimalOneFractionDigitPercentagePoints();
  }

  @Override
  public boolean isTypePresentDecimalTwoFractionDigits() {
    return column.isTypePresentDecimalTwoFractionDigits();
  }

  @Override
  public boolean isTypePresentDecimalTwoFractionDigitsPercentage() {
    return column.isTypePresentDecimalTwoFractionDigitsPercentage();
  }

  @Override
  public boolean isTypePresentDecimalTwoFractionDigitsPercentagePoints() {
    return column.isTypePresentDecimalTwoFractionDigitsPercentagePoints();
  }

  @Override
  public boolean isTypePresentDecimalThreeFractionDigits() {
    return column.isTypePresentDecimalThreeFractionDigits();
  }

  @Override
  public boolean isTypePresentDecimalThreeFractionDigitsPercentage() {
    return column.isTypePresentDecimalThreeFractionDigitsPercentage();
  }

  @Override
  public boolean isTypePresentDecimalThreeFractionDigitsPercentagePoints() {
    return column.isTypePresentDecimalThreeFractionDigitsPercentagePoints();
  }

  @Override
  public boolean isTypePresentBoolean() {
    return column.isTypePresentBoolean();
  }

  @Override
  public boolean isTypePresentDate() {
    return column.isTypePresentDate();
  }

  @Override
  public boolean isTypePresentTimestamp() {
    return column.isTypePresentTimestamp();
  }

  @Override
  public boolean isTypePresentTime() {
    return column.isTypePresentTime();
  }

  @Override
  public boolean isTypePresentEnum() {
    return column.isTypePresentEnum();
  }

  @Override
  public boolean isTypePresentCollection() {
    return column.isTypePresentCollection();
  }

  @Override
  public boolean isTypePresentColor() {
    return column.isTypePresentColor();
  }

  @Override
  public boolean isIconPresent() {
    return column.isIconPresent();
  }

  @Override
  public boolean isIconRendered(Kandidatur kandidatur) {
    return column.isIconRendered(kandidatur.getWahlvorschlag());
  }

  @Override
  public String getIcon(Kandidatur kandidatur) {
    return column.getIcon(kandidatur.getWahlvorschlag());
  }

  @Override
  public String getIconTitle(Kandidatur kandidatur) {
    return column.getIconTitle(kandidatur.getWahlvorschlag());
  }

  @Override
  public String getIconStyleClass(Kandidatur kandidatur) {
    return column.getIconStyleClass(kandidatur.getWahlvorschlag());
  }

  @Override
  public String getIconStyle(Kandidatur kandidatur) {
    return column.getIconStyle(kandidatur.getWahlvorschlag());
  }

  @Override
  public String getTooltip(Kandidatur kandidatur) {
    return column.getTooltip(kandidatur.getWahlvorschlag());
  }

  @Nullable
  @Override
  public EagerLoading<E> getEagerLoading() {
    return new AbstractEagerLoading<E>() {

      @Override
      public E eagerLoad(E kandidatur) {
        DirektkandidaturWahlvorschlagColumn<E> direktkandidaturWahlvorschlagColumn = DirektkandidaturWahlvorschlagColumn.this;
        direktkandidaturWahlvorschlagColumn.getValue(kandidatur);
        direktkandidaturWahlvorschlagColumn.getTooltip(kandidatur);
        direktkandidaturWahlvorschlagColumn.getIcon(kandidatur);

        return kandidatur;
      }
    };
  }

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

  @Override
  public boolean isSummeImExportAusgeben() {
    return false;
  }

  @Override
  public boolean isNullValueOutputPresent() {
    return false;
  }

  @Nullable
  @Override
  public String getNullValueOutput() {
    return null;
  }
}
