
package de.ivu.elect.business.wahlvorschlag.entity;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahlvorschlag.control.ReferendumOptionByPositionComparator;


import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isBlank;

public abstract class AbstractReferendumOption extends Wahlvorschlag implements ReferendumOptionBase {

  private static final long serialVersionUID = 1L;

  public AbstractReferendumOption() {
    super();
  }

  @Override
  public boolean hasSameWahlvorschlagArt(AbstractWahlvorschlag wahlvorschlag) {
    return nonNull(wahlvorschlag) && wahlvorschlag.isReferendumOption();
  }

  @Override
  public boolean isListe() {
    return false;
  }

  @Override
  public Liste getListe() {
    throw new IllegalStateException("Ist Option eines Referendums!");
  }

  @Override
  public boolean isDirektkandidat() {
    return false;
  }

  @Override
  public Direktkandidat getDirektkandidat() {
    throw new IllegalStateException("Ist Option eines Referendums!");
  }

  @Override
  public boolean isReferendumOption() {
    return true;
  }

  @Override
  public ReferendumOption getReferendumOption() {
    return (ReferendumOption) this;
  }

  List<ReferendumOption> alleOptionenDerFrage;

  public List<ReferendumOption> getAlleOptionenDerFrageSortiertNachPosition() {
    if (alleOptionenDerFrage == null) {
      alleOptionenDerFrage = new ArrayList<>(getGruppeImGebiet().getReferendumOptionen());
      Collections.sort(alleOptionenDerFrage, new ReferendumOptionByPositionComparator());
    }

    return alleOptionenDerFrage;
  }

  public Long getPositionAbsolutErstePositionIstNull() {
    return (long) getAlleOptionenDerFrageSortiertNachPosition().indexOf(this);
  }

  public String getKurzbezeichnungWennGesetztSonstLabel() {
    if (isBlank(getKurzbezeichnung())) {
      return getLabel();
    }
    return getKurzbezeichnung();
  }

  @Override
  public Set<Kandidatur> getKandidaturen() {
    return Collections.emptySet();
  }
}
