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;

/**
 *  on 26.05.2015.
 */
public class PolitischeGruppeKergGruppeContainer extends AbstractKergGruppeContainer<PolitischeGruppe> {

  protected PolitischeGruppeKergGruppeContainer(ErgebnisDaten ergebnisDaten, PolitischeGruppe gruppe, Wahldurchfuehrungsgebiet gebiet, Stimmabgabeart stimmabgabeart) {
    super(ergebnisDaten, gruppe, gebiet, stimmabgabeart);
  }

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

  @Nullable
  @Override
  protected Long getErstStimmenVorperiode() {
    if (isGruppeErststimmenVorperiodeMoeglich()) {
      return getErststimmenVorperiodeDirekt();
    }
    return null;
  }

  @Nullable
  private Long getErststimmenVorperiodeDirekt() {
    return getErgebnisDaten().getErststimmenVorperiode(getGruppe(), getGebiet(), getStimmabgabeart());
  }

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

  @Nullable
  @Override
  protected Long getZweitStimmenVorperiode() {
    if (isGruppeZweitstimmenVorperiodeMoeglich()) {
      return getZweitstimmenVorperiodeDirekt();
    }
    return null;
  }

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

  private Boolean gruppeZweitstimmenMoeglich = null;

  private boolean isGruppeZweitstimmenMoeglich() {
    if (gruppeZweitstimmenMoeglich == null) {
      gruppeZweitstimmenMoeglich = isListeInGebietshierarchie();
    }
    return gruppeZweitstimmenMoeglich;
  }

  private boolean isGruppeZweitstimmenVorperiodeMoeglich(){
    return getZweitstimmenVorperiodeDirekt()!=null && getZweitstimmenVorperiodeDirekt() > 0 && ( isGruppeZweitstimmenMoeglich() || /*WASDE-1249 und WASDE-1290*/ isTrittInWahlAn());
  }


  private Boolean gruppeErststimmenMoeglich = null;

  private boolean isGruppeErststimmenMoeglich() {
    if (gruppeErststimmenMoeglich == null) {
      gruppeErststimmenMoeglich = isDirektKandidaturInGebietshierachie();
    }
    return gruppeErststimmenMoeglich;
  }

  private boolean isGruppeErststimmenVorperiodeMoeglich() {
    return getErststimmenVorperiodeDirekt()!=null && getErststimmenVorperiodeDirekt() > 0 && (isGruppeErststimmenMoeglich() || /*WASDE-1249  und WASDE-1290*/ isTrittInWahlAn());
  }

  private boolean isDirektKandidaturInGebietshierachie() {
    return getErgebnisDaten().getPolitischeGruppeMitZugelassenenDirektkandidatenInGebietshierarchie(getGebiet())
        .contains(getGruppe());
  }

  // WASDE-1290
  private boolean isTrittInWahlAn() {
    return getErgebnisDaten().getPolitischeGruppeMitZugelassenenDirektkandidatenInGebietshierarchie(getErgebnisDaten().getWurzelgebiet())
            .contains(getGruppe()) || getErgebnisDaten().getPolitischeGruppeMitListenInGebietshierarchie(getErgebnisDaten().getWurzelgebiet())
            .contains(getGruppe());
  }

  private boolean isListeInGebietshierarchie() {
    return getErgebnisDaten().getPolitischeGruppeMitListenInGebietshierarchie(getGebiet()).contains(getGruppe());
  }

}
