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

import static de.ivu.elect.jee.entity.EntityUtil.castTo;

import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.WaehlerBenannteKandidaturen;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.presentation.person.table.AbstractPersonendatenColumn;

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

  private static final long serialVersionUID = 1L;

  private final Icons icons;

  public KandidaturNameMitIconColumn(AbstractPersonendatenColumn<E> template, Icons icons) {
    super(template.getId(), template.getMessages(), template.getHeaderKey(), template.getType(), template::getValue);

    this.icons = icons;
  }

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

  @Override
  public boolean isIconRendered(E kandidatur) {
    return isWaehlerBenannteKandidaturSonstige(kandidatur);
  }

  @Override
  public String getIcon(E kandidatur) {
    return icons.getIconAlert();
  }

  @Override // ELECT-9513, cf. KandidaturKumulierteStimmenNameColumn!!!
  public String getTooltip(E kandidatur) {
    if (isWaehlerBenannteKandidaturSonstige(kandidatur)) {
      return formatWaehlerBenannteKandidaturSonstigeBeschreibung(kandidatur);
    }

    return super.getTooltip(kandidatur);
  }

  private String formatWaehlerBenannteKandidaturSonstigeBeschreibung(Kandidatur kandidatur) {
    if (kandidatur != null) {
      if (kandidatur.isDirektkandidatur()) {
        return WaehlerBenannteKandidaturen.formatWaehlerBenannteDirektkandidaturSonstigeBeschreibung(getMessages(), castTo(kandidatur, Direktkandidatur.class));
      }

      if (kandidatur.isListenkandidatur()) {
        return WaehlerBenannteKandidaturen.formatWaehlerBenannteListenkandidaturSonstigeBeschreibung(getMessages(), castTo(kandidatur, Listenkandidatur.class));
      }
    }

    return "";
  }

  private boolean isWaehlerBenannteKandidaturSonstige(Kandidatur kandidatur) {
    return WaehlerBenannteKandidaturen.isWaehlerBenannteDirektkandidaturSonstige(getMessages(), kandidatur)
        || WaehlerBenannteKandidaturen.isWaehlerBenannteListenkandidaturSonstige(getMessages(), kandidatur);
  }
}
