
package de.ivu.elect.was.exchange.kerg;

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.entity.Stimmabgabeart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;

public class PolitischeGruppeKergGruppeContainer extends AbstractKergGruppeContainer<PolitischeGruppe> {

  private final boolean gruppeTrittInWahlAn;

  private final boolean gruppeDirektstimmenMoeglich;

  private final boolean gruppeListenstimmenMoeglich;

  public PolitischeGruppeKergGruppeContainer(ErgebnisDaten ergebnisDaten, PolitischeGruppe gruppe, Wahldurchfuehrungsgebiet gebiet, Stimmabgabeart stimmabgabeart, boolean gruppeTrittInWahlAn,
      boolean gruppeDirektstimmenInGebietshierachieErfassbar, boolean gruppeListenstimmenInGebietshierachieErfassbar) {
    super(ergebnisDaten, gruppe, gebiet, stimmabgabeart);

    this.gruppeTrittInWahlAn = gruppeTrittInWahlAn;

    this.gruppeDirektstimmenMoeglich = gruppeDirektstimmenInGebietshierachieErfassbar;
    this.gruppeListenstimmenMoeglich = gruppeListenstimmenInGebietshierachieErfassbar;
  }

  private boolean isGruppeTrittInWahlAn() {
    return gruppeTrittInWahlAn;
  }

  @Nullable
  @Override
  protected Long getErstStimmenAktuell() {
    if (isGruppeDirektstimmenMoeglich()) {
      return getErgebnisDaten().getErststimmenAktuell(getGruppe(), getGebiet(), getStimmabgabeart());
    }

    return null;
  }

  private boolean isGruppeDirektstimmenMoeglich() {
    return gruppeDirektstimmenMoeglich;
  }

  @Nullable
  @Override
  protected Long getErstStimmenVorperiode() {
    if (isGruppeDirektstimmenVorperiodeMoeglich()) {
      return getDirektstimmenVorperiode();
    }

    return null;
  }

  private boolean isGruppeDirektstimmenVorperiodeMoeglich() {
    return getDirektstimmenVorperiode() != null && (isGruppeDirektstimmenMoeglich() || isGruppeTrittInWahlAn());
  }

  @Nullable // ELECT-8913 null wenn kein Wahlvorschlag
  private Long getDirektstimmenVorperiode() {
    return getErgebnisDaten().getErststimmenVorperiode(getGruppe(), getGebiet(), getStimmabgabeart());
  }

  @Nullable
  @Override
  protected Long getZweitStimmenAktuell() {
    if (isGruppeListenstimmenMoeglich()) {
      return getErgebnisDaten().getZweitstimmenAktuell(getGruppe(), getGebiet(), getStimmabgabeart());
    }

    return null;
  }

  private boolean isGruppeListenstimmenMoeglich() {
    return gruppeListenstimmenMoeglich;
  }

  @Nullable
  @Override
  protected Long getZweitStimmenVorperiode() {
    if (isGruppeListenstimmenVorperiodeMoeglich()) {
      return getListenstimmenVorperiode();
    }

    return null;
  }

  private boolean isGruppeListenstimmenVorperiodeMoeglich() {
    return getListenstimmenVorperiode() != null && (isGruppeListenstimmenMoeglich() || isGruppeTrittInWahlAn());
  }

  @Nullable // ELECT-8913 null wenn kein Wahlvorschlag
  private Long getListenstimmenVorperiode() {
    return getErgebnisDaten().getZweitstimmenVorperiode(getGruppe(), getGebiet(), getStimmabgabeart());
  }
}
