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

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.boundary.KandidaturExtendedDAO;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturKumulierteStimmen;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

// Cf. KandidaturGewaehltGewaehltRangColumn!
public abstract class AbstractKandidaturKumulierteStimmenGewaehltRangColumn extends AbstractColumnEntry<KandidaturKumulierteStimmen> {

  private static final long serialVersionUID = 1L;

  private final Ergebnisart ergebnisart;

  private final KandidaturGewaehltGewaehltRangColumn column;

  private final KandidaturExtendedDAO kandidaturExtendedDAO;

  public AbstractKandidaturKumulierteStimmenGewaehltRangColumn(@Nullable Gebiet gebietSelected, Ergebnis ergebnis, Messages messages, KandidaturExtendedDAO kandidaturExtendedDAO) {
    super(messages);

    this.ergebnisart = ergebnis.getErgebnisart();
    this.kandidaturExtendedDAO = kandidaturExtendedDAO;

    this.column = new KandidaturGewaehltGewaehltRangColumn(gebietSelected, messages);
  }

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

  @Override
  public String getHeader() {
    return column.getHeader();
  }

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

    return null;
  }

  @Nullable
  protected Gewaehlt getGewaehlt(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    return kandidaturKumulierteStimmen.getGewaehlt(attachKandidatur(getKandidatur(kandidaturKumulierteStimmen)), ergebnisart).orElse(null);
  }

  @Nullable
  protected abstract Kandidatur getKandidatur(KandidaturKumulierteStimmen kandidaturKumulierteStimmen);

  @Nullable
  protected Kandidatur attachKandidatur(Kandidatur kandidatur) {
    if (kandidatur==null) {
      return null;
    }
    // ELECTKOM-1110
    return kandidaturExtendedDAO.attach(kandidatur);
  }


  @Override // ELECT-8802
  public String getTooltip(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    String defaultTooltip = super.getTooltip(kandidaturKumulierteStimmen);

    if (kandidaturKumulierteStimmen != null) {
      return column.getTooltipByAbstandStimmzettelPositionGewaehltRang(kandidaturKumulierteStimmen.getGebiet(), getStimmzettelPosition(kandidaturKumulierteStimmen), getRang(kandidaturKumulierteStimmen), defaultTooltip);
    }

    return defaultTooltip;
  }

  @Override // ELECT-8802
  public String getStyleClass(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    String defaultStyleClass = super.getStyleClass(kandidaturKumulierteStimmen);

    if (kandidaturKumulierteStimmen != null) {
      return column.getStyleClassByAbstandStimmzettelPositionGewaehltRang(kandidaturKumulierteStimmen.getGebiet(), getStimmzettelPosition(kandidaturKumulierteStimmen), getRang(kandidaturKumulierteStimmen), defaultStyleClass);
    }

    return defaultStyleClass;
  }

  private Long getStimmzettelPosition(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    return kandidaturKumulierteStimmen.getStimmzettelPosition(attachKandidatur(getKandidatur(kandidaturKumulierteStimmen)));
  }

  private Long getRang(KandidaturKumulierteStimmen kandidaturKumulierteStimmen) {
    return getValue(kandidaturKumulierteStimmen);
  }
}
