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

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

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.KandidaturKumulierteStimmen;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeStimmenartLabelGenerator;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

public abstract class AbstractKandidaturKumulierteStimmenAnzahlStimmenColumn extends AbstractColumnEntry<KandidaturKumulierteStimmen> {

  private static final long serialVersionUID = 1L;

  private static final String HEADER_MSG_KEY_PREFIX = "kandidatur.kumulierte.stimmen.anzahl.";

  private final Gebiet gebiet;

  private final boolean stimmenartenUnterscheiden;

  private final StimmeingabeStimmenartLabelGenerator stimmenartLabelGenerator;

  public AbstractKandidaturKumulierteStimmenAnzahlStimmenColumn(Gebiet gebiet, boolean stimmenartenUnterscheiden, Messages messages, StimmeingabeStimmenartLabelGenerator stimmenartLabelGenerator) {
    super(messages);

    this.gebiet = gebiet;

    this.stimmenartenUnterscheiden = stimmenartenUnterscheiden;

    this.stimmenartLabelGenerator = stimmenartLabelGenerator;
  }

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

  @Override
  public String getHeader() {
    if (stimmenartenUnterscheiden) {
      Stimmenart stimmenart = getStimmenart();

      String stimmenartName = stimmenartLabelGenerator.getStimmenartName(gebiet, stimmenart);

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

      return getMessage(HEADER_MSG_KEY_PREFIX + stimmenart.name());
    }

    return getMessage(HEADER_MSG_KEY_PREFIX + "stimmen");
  }

  @Override
  @Nullable
  public Long getValue(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    if (kandidaturKumulierteStimmen != null) {
      return getAnzahlStimmen(kandidaturKumulierteStimmen);
    }

    return null;
  }

  protected abstract Long getAnzahlStimmen(KandidaturKumulierteStimmen kandidaturKumulierteStimmen);

  protected abstract Stimmenart getStimmenart();
}
