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

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.ergebnis.entity.GewaehltConstants;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturGewaehlt;
import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.jee.faces.FacesMessageUtil;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class KandidaturGewaehltGewaehltGewaehltStatusColumn extends AbstractKandidaturGewaehltGewaehltColumn {

  private static final long serialVersionUID = 1L;

  private final Icons icons;

  public KandidaturGewaehltGewaehltGewaehltStatusColumn(Messages messages, Icons icons) {
    super(messages);

    this.icons = icons;
  }

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

  @Override
  public String getHeader() {
    return getMessage(GewaehltConstants.MESSAGE_KEY_GEWAEHLT_STATUS_EINZAHL);
  }

  @Override
  public Object getValue(KandidaturGewaehlt kandidaturGewaehlt) {
    Object result = super.getValue(kandidaturGewaehlt);

    if (result instanceof String) {
      String kandidaturStatusFormatted = formatKandidaturStatusIfNotDefault(kandidaturGewaehlt, true);

      if (isNotBlank(kandidaturStatusFormatted)) {
        return result + " (" + kandidaturStatusFormatted + ")";
      }
    }

    return result;
  }

  @Override
  public Object getValue(Gewaehlt gewaehlt) {
    return getMessage(gewaehlt.getGewaehltStatus());
  }

  @Override
  public String getTooltip(KandidaturGewaehlt kandidaturGewaehlt) {
    String kandidaturStatusFormatted = formatKandidaturStatusIfNotDefault(kandidaturGewaehlt, false);

    if (isNotBlank(kandidaturStatusFormatted)) {
      return kandidaturStatusFormatted;
    }

    return super.getTooltip(kandidaturGewaehlt);
  }

  private String formatKandidaturStatusIfNotDefault(KandidaturGewaehlt kandidaturGewaehlt, boolean msgKeyKurz) {
    if (kandidaturGewaehlt != null) {
      Kandidatur kandidatur = kandidaturGewaehlt.getKandidatur();

      if (kandidatur != null) {
        KandidaturStatus kandidaturStatus = kandidatur.getKandidaturStatus();

        if (!KandidaturStatus.ZUGELASSEN.equals(kandidaturStatus)) { // KandidaturStatus.ZUGELASSEN ist Standard und uninteressant!
          String msgKey = FacesMessageUtil.getEnumMessageKey(kandidaturStatus);

          if (msgKeyKurz) {
            return getMessage(msgKey + ".kurz");
          }

          String message = getMessage(msgKey);

          if (isNotBlank(kandidatur.getBemerkung())) {
            message += TOOLTIP_LINE_SEPARATOR;
            message += TOOLTIP_LINE_SEPARATOR;
            message += kandidatur.getBemerkung();
          }

          return message;
        }
      }
    }

    return "";
  }

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

  @Override
  public boolean isIconRendered(KandidaturGewaehlt kandidaturGewaehlt) {
    Gewaehlt gewaehlt = getGewaehlt(kandidaturGewaehlt);

    if (gewaehlt == null) {
      return false;
    }

    return true;
  }

  @Override
  public String getIcon(KandidaturGewaehlt kandidaturGewaehlt) {
    Gewaehlt gewaehlt = getGewaehlt(kandidaturGewaehlt);

    if (gewaehlt == null) {
      return null;
    }

    return gewaehlt.getGewaehltStatus().getIcon(icons);
  }
}
