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

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

import java.util.Collection;

import de.ivu.elect.business.kandidatur.entity.KandidaturStatus;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturConstants;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.faces.UserLocale;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.wahl.CurrentWahlZulassungspruefungExtended;

public class ListeAnzahlenListenkandidaturPerKandidaturStatusColumn extends AbstractWahlvorschlagColumn<Liste> implements WahlvorschlagZulassungspruefungColumn<Liste> {

  private static final long serialVersionUID = 1L;

  private final UserLocale userLocale;

  private final CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  protected ListeAnzahlenListenkandidaturPerKandidaturStatusColumn(Messages messages, UserLocale userLocale, CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung) {
    super("Liste-Anzahlen-Listenkandidatur-Per-Kandidatur-Status", messages, null, ColumnType.STRING, null);

    this.userLocale = userLocale;

    this.currentWahlZulassungspruefung = currentWahlZulassungspruefung;
  }

  @Override
  public boolean isRendered() {
    return super.isRendered() && isRendered(getCurrentWahlZulassungspruefung());
  }

  @Override
  public boolean isRendered(CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung) {
    return true; // Cf. ListeAnzahlenListenkandidaturPerKandidaturStatusColumn#isKandidaturStatusRendered
  }

  protected boolean isKandidaturStatusRendered() {
    return getCurrentWahlZulassungspruefung().isZulassungBearbeitbar(); // WASDE-1356
  }

  @Override
  public String getHeader() {
    if (isKandidaturStatusRendered()) {
      return getMessage("liste.anzahlen.listenkandidatur.per.kandidatur.status.header");
    }

    return getMessage(ListenkandidaturConstants.MESSAGE_KEY_ENTITY_MEHRZAHL);
  }

  @Override
  public Object getValue(Liste liste) {
    if (liste.isEinzelbewerber()) {
      return ""; // ELECT-12006
    }

    Collection<Listenkandidatur> listenkandidaturen = liste.getListenkandidaturen();

    if (isKandidaturStatusRendered()) {
      int anzahlListenkandidaturenZugelassen = 0;
      int anzahlListenkandidaturenOffen = 0;
      int anzahlListenkandidaturenNichtZugelassen = 0;

      for (Listenkandidatur listenkandidatur : listenkandidaturen) {
        KandidaturStatus kandidaturStatus = listenkandidatur.getKandidaturStatus();

        if (kandidaturStatus.isZugelassen()) {
          anzahlListenkandidaturenZugelassen++;
        }

        if (kandidaturStatus.isUngeprueft()) {
          anzahlListenkandidaturenOffen++;
        }

        if (kandidaturStatus.isNichtZugelassenOderNichtMehrZugelassen()) {
          anzahlListenkandidaturenNichtZugelassen++;
        }
      }

      return getMessage("liste.anzahlen.listenkandidatur.per.kandidatur.status.value", formatNumber(anzahlListenkandidaturenZugelassen), formatNumber(anzahlListenkandidaturenOffen),
          formatNumber(anzahlListenkandidaturenNichtZugelassen));
    }

    return formatNumber(listenkandidaturen.size());
  }

  protected String formatNumber(int value) {
    if (value <= 0) {
      return "-";
    }

    return userLocale.formatNumber((long) value);
  }

  @Override
  public String getStyleClass() {
    return trimToEmpty(super.getStyleClass()) + " ui-dt-c-numeric";
  }

  private CurrentWahlZulassungspruefungExtended getCurrentWahlZulassungspruefung() {
    return currentWahlZulassungspruefung;
  }
}
