
package de.ivu.elect.business.sitzberechnung.control.absolutemehrheitswahl;

import java.util.Locale;

import de.ivu.elect.business.ergebnis.control.ErgebnisDatenQuorum;
import de.ivu.elect.business.ergebnis.entity.ErgebnisLogEintragArt;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.kandidatur.entity.Direktkandidatur;
import de.ivu.elect.business.sitzberechnung.control.util.SitzberechnungProGebietHelper;
import de.ivu.elect.business.sitzberechnung.entity.SitzberechnungsalgorithmusKonfiguration;
import de.ivu.elect.business.sitzberechnung.entity.Sitzberechnungseingabe;
import de.ivu.elect.util.NotNull;

public class AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmusInternal extends AbstractAbsoluteMehrheitswahlSitzberechnungsalgorithmusInternal {

  AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmusInternal(AbsoluteMehrheitswahlMitQuorumSitzberechnungsalgorithmus sitzberechnungsalgorithmus,
      Sitzberechnungseingabe<SitzberechnungsalgorithmusKonfiguration> sitzberechnungseingabe) {
    super(sitzberechnungsalgorithmus, sitzberechnungseingabe);
  }

  @Override
  protected void markiereGewaehlte(SitzberechnungProGebietHelper helper, Wahldurchfuehrungsgebiet direktwahlgebiet, AbsoluteMehrheitswahlKandidaturenNachStimmenSortierer sortierer) {
    ErgebnisDatenQuorum ergebnisDatenQuorum = getErgebnisDatenQuorumWahlberechtigte(sitzberechnungseingabe);

    if (!ergebnisDatenQuorum.isProzentsatzVorhanden()) {
      helper.log(ErgebnisLogEintragArt.WARNUNG, "sitzberechnung.algorithmus.mehrheitswahl.noch.kein.quorum", direktwahlgebiet.getName());

      return;
    }

    if (!ergebnisDatenQuorum.isGrundwertVorhanden(direktwahlgebiet)) {
      helper.log(ErgebnisLogEintragArt.WARNUNG, "sitzberechnung.algorithmus.mehrheitswahl.noch.keine.anzahl.wahlberechtigte.gesamt", direktwahlgebiet.getName());

      return;
    }

    helper.log(ErgebnisLogEintragArt.INFO, "sitzberechnung.algorithmus.mehrheitswahl.anzahl.stimmen.quorum", direktwahlgebiet.getName(),
        getAnzahlStimmenLautQuorumMinimal(sitzberechnungseingabe, direktwahlgebiet), ergebnisDatenQuorum.getProzentsatzFormatted(Locale.getDefault()));

    super.markiereGewaehlte(helper, direktwahlgebiet, sortierer);
  }

  @Override
  protected void markiereGewaehlteErstplatzierterAbsoluteMehrheit(SitzberechnungProGebietHelper helper, Wahldurchfuehrungsgebiet direktwahlgebiet,
      AbsoluteMehrheitswahlKandidaturenNachStimmenSortierer sortierer) {
    Direktkandidatur erstplatzierter = sortierer.getErstplatzierte().iterator().next();
    long anzahlStimmenErstplatzierter = NotNull.notNull(sortierer.getHoechsteStimmenzahl());

    long anzahlStimmenErstplatzierterLautQuorumMinimal = getAnzahlStimmenLautQuorumMinimal(sitzberechnungseingabe, direktwahlgebiet);
    boolean anzahlStimmenErstplatzierterLautQuorumMinimalErreicht = anzahlStimmenErstplatzierterLautQuorumMinimal > 0L && anzahlStimmenErstplatzierter >= anzahlStimmenErstplatzierterLautQuorumMinimal;

    if (anzahlStimmenErstplatzierterLautQuorumMinimalErreicht) {
      super.markiereGewaehlteErstplatzierterAbsoluteMehrheit(helper, direktwahlgebiet, sortierer);
    } else {
      helper.log(ErgebnisLogEintragArt.WARNUNG, "sitzberechnung.algorithmus.mehrheitswahl.kandidat.gewinnt.quorum.verfehlt", direktwahlgebiet.getName(), helper.displayPerson(erstplatzierter),
          anzahlStimmenErstplatzierter, anzahlStimmenErstplatzierterLautQuorumMinimal);

      if (sortierer.sindTeilnehmerAnStichwahlEindeutig()) {
        markiereGewaehlteTeilnehmerInStichwahlEindeutig(helper, direktwahlgebiet, sortierer);
      } else {
        markiereGewaehlteZweitplatzierteUnentschieden(helper, direktwahlgebiet, sortierer);
      }
    }
  }
}
