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

import static java.util.stream.Collectors.joining;
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.DefaultColumnEntry;
import de.ivu.elect.presentation.verteilung.VerteilungBerechnenViewTeilnehmerErgebnis;

public class VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn extends DefaultColumnEntry<VerteilungBerechnenViewTeilnehmerErgebnis> {

  private static final long serialVersionUID = 1L;

  private static final String MARKER_ANZAHL_SITZE_ANSPRUCH_VORAB = "+";

  private boolean markAnzahlSitzeAnspruchVorab;

  public VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn(Messages messages, Locale locale, boolean markAnzahlSitzeAnspruchVorab) {
    super("VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn", messages, "VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn.header", ColumnType.STRING,
        teilnehmerErgebnis -> {
          String result = "";

          if (markAnzahlSitzeAnspruchVorab && teilnehmerErgebnis.getAnzahlSitzeAnspruchVorab() > 0L) {
            result += " " + MARKER_ANZAHL_SITZE_ANSPRUCH_VORAB;
          }

          // Wert nach hinten, da Spalte rechtsbündig (numerische Werte) angezeigt werden...
          result += " " + NumberFormat.getInstance(locale).format(teilnehmerErgebnis.getAnzahlSitzeAnspruch());

          return result;
        });

    this.markAnzahlSitzeAnspruchVorab = true;
  }

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

  @Override
  public String getTooltip(VerteilungBerechnenViewTeilnehmerErgebnis teilnehmerErgebnis) {
    String result = "";

    if (teilnehmerErgebnis != null) {
      result = collectTooltips(teilnehmerErgebnis).stream().collect(joining(TOOLTIP_LINE_SEPARATOR));
    }

    return defaultIfBlank(result, super.getTooltip(teilnehmerErgebnis));
  }

  public List<String> collectTooltips(VerteilungBerechnenViewTeilnehmerErgebnis teilnehmerErgebnis) {
    List<String> result = new ArrayList<>();

    long anzahlSitzeAnspruchVorab = teilnehmerErgebnis.getAnzahlSitzeAnspruchVorab();

    if (markAnzahlSitzeAnspruchVorab && anzahlSitzeAnspruchVorab > 0L) {
      result.add(getMessage("VerteilungBerechnenViewTeilnehmerErgebnisAnzahlSitzeAnspruchColumn.tooltip.anzahlSitzeVorab", MARKER_ANZAHL_SITZE_ANSPRUCH_VORAB, anzahlSitzeAnspruchVorab));
    }

    return result;
  }
}
