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

import java.util.Collection;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.AbstractColumnEntry;
import de.ivu.elect.presentation.wahl.CurrentWahlZulassungspruefungExtended;
import de.ivu.elect.presentation.wahl.table.ZulassungspruefungColumn;

public abstract class AbstractGruppeImGebietWahlvorschlagZulassungColumn<E extends Wahlvorschlag> extends AbstractColumnEntry<GruppeImGebiet>
    implements
    ZulassungspruefungColumn {

  private static final long serialVersionUID = 1L;

  private final Gebiet gebiet;

  private final EntityAufStimmzettelDaten entityAufStimmzettelDaten;

  private final CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung;

  public AbstractGruppeImGebietWahlvorschlagZulassungColumn(Messages messages, Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten,
      CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung) {
    super(messages);

    this.gebiet = gebiet;

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;

    this.currentWahlZulassungspruefung = currentWahlZulassungspruefung;
  }

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

  @Override
  public boolean isRendered(CurrentWahlZulassungspruefungExtended currentWahlZulassungspruefung) {
    return currentWahlZulassungspruefung.isZulassungBearbeitbar(); // WASDE-1356
  }

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

  @Override
  public Object getValue(GruppeImGebiet gruppeImGebiet) {
    E wahlvorschlag = findWahlvorschlag(gruppeImGebiet, collectWahlvorschlaegeInWahl(gruppeImGebiet));

    if (wahlvorschlag != null) {
      return getValue(wahlvorschlag);
    }

    return null;
  }

  protected abstract String getValue(E wahlvorschlag);

  protected abstract E findWahlvorschlag(GruppeImGebiet gruppeImGebiet, Collection<Wahlvorschlag> wahlvorschlaegeInWahl);

  protected boolean isWahlvorschlagRelevantInGebietshierarchie(GruppeImGebiet gruppeImGebiet, Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag.isZugelassenOderUnbestimmt() && wahlvorschlag.getGruppe().equals(gruppeImGebiet.getGruppe())
        && gruppeImGebiet.getGebiet().isInGebietshierarchieUntergeordnetesGebietVon(wahlvorschlag.getGebiet());
  }

  protected Collection<Wahlvorschlag> collectWahlvorschlaegeInWahl(GruppeImGebiet gruppeImGebiet) {
    return getEntityAufStimmzettelDaten().collectWahlvorschlaegeInWahl(gruppeImGebiet.getWahl());
  }

  protected EntityAufStimmzettelDaten getEntityAufStimmzettelDaten() {
    return entityAufStimmzettelDaten;
  }

  protected Gebiet getGebiet() {
    return gebiet;
  }

  protected CurrentWahlZulassungspruefungExtended getCurrentWahlZulassungspruefung() {
    return currentWahlZulassungspruefung;
  }
}
