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

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
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;

// Cf. WahlvorschlagStimmzettelPositionColumn!
public class ListenkandidaturStimmzettelPositionColumn<E extends Kandidatur> extends AbstractKandidaturColumn<E> {

  private static final long serialVersionUID = 1L;

  public static final String HEADER_MSG_KEY = KandidaturStimmzettelPositionColumn.HEADER_MSG_KEY;

  private final Icons icons;

  public ListenkandidaturStimmzettelPositionColumn(Messages messages, Icons icons, Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super("Listenkandidatur-Stimmzettel-Position", messages, HEADER_MSG_KEY, ColumnType.LONG, kandidatur -> {
      if (isListenkandidatur(kandidatur)) {
        return castTo(kandidatur, Listenkandidatur.class).getStimmzettelPosition(gebiet, entityAufStimmzettelDaten).getPosition();
      }

      return null;
    });

    this.icons = icons;
  }

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

  @Override
  public boolean isIconRendered(E kandidatur) {
    if (isListenkandidatur(kandidatur)) {
      return hasStimmzettelPosition(kandidatur) && castTo(kandidatur, Listenkandidatur.class).getVorgegebenePosition() != null;
    }

    return super.isIconRendered(kandidatur);
  }

  @Override
  public String getIcon(E kandidatur) {
    if (isIconRendered(kandidatur)) {
      return icons.getIconCheck();
    }

    return super.getIcon(kandidatur);
  }

  @Override
  public String getTooltip(E kandidatur) {
    if (isIconRendered(kandidatur)) {
      return getMessage("kandidatur.position.stimmzettel.vorgegeben.tooltip");
    }

    return super.getTooltip(kandidatur);
  }

  private boolean hasStimmzettelPosition(E kandidatur) {
    return getValue(kandidatur) != null;
  }

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