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

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

import de.ivu.elect.business.kandidatur.boundary.WaehlerBenannteKandidaturKonfiguration;
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.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 WaehlerBenannteKandidaturKonfiguration waehlerBenannteKandidaturKonfiguration;

  private final Icons icons;

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

    this.waehlerBenannteKandidaturKonfiguration = waehlerBenannteKandidaturKonfiguration;

    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 getWaehlerBenannteKandidaturKonfiguration().formatWaehlerBenannteDirektkandidaturSonstigeBeschreibung(getMessages(), castTo(kandidatur, Direktkandidatur.class));
      }

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

    return "";
  }

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

  private WaehlerBenannteKandidaturKonfiguration getWaehlerBenannteKandidaturKonfiguration() {
    return waehlerBenannteKandidaturKonfiguration;
  }
}
