
package de.ivu.elect.business.stimmeingabe.control.plausi;

import javax.inject.Inject;

import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeErfassenDescriptionResolver;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeKopfzahlKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeKopfzahlErfassenModel;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiFehlerart;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiTyp;
import de.ivu.elect.jee.faces.Messages;

public class BtwKopfzahlPlausiBuilder extends AbstractKopfzahlPlausiBuilder {

  @Inject
  private transient BtwStimmeingabePlausiDefinitions stimmeingabePlausiDefinitions;

  public BtwKopfzahlPlausiBuilder() {
    super();
  }

  @Deprecated // nur für Tests
  public BtwKopfzahlPlausiBuilder(Messages messages, StimmeingabeErfassenDescriptionResolver stimmeingabeErfassenDescriptionResolver,
      StimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration) {
    super(messages, stimmeingabeErfassenDescriptionResolver, stimmeingabeKopfzahlKonfiguration);
  }

  @Override
  protected AbstractStimmeingabePlausiDefinitions getStimmeingabePlausiDefinitions(Ergebniseingang ergebniseingang) {
    return stimmeingabePlausiDefinitions;
  }

  @Override
  protected void fillKopfzahlPlausisWahlartSpezifisch(StimmeingabeKopfzahlErfassenModel model, StimmeingabePlausiBuilderContext context) {
    if (!isBriefwahl(context)) {
      if (isSonderstimmbezirk(context)) {
        fillSonderstimmbezirkWahlberechtigtePlausis(model, context);
        fillSonderstimmbezirkWaehlerPlausis(model, context);
      } else {
        fillUrnenwahlbezirkWahlberechtigteAnzahlGleichWahlberechtigteAnzahlAmGebietPlausis(model, context);
        fillUrnenwahlbezirkKopfzahlSummenPlausis(model, context);
        fillUrnenwahlbezirkKopfzahlVergleichPlausis(model, context);
      }
    }

    fillKopfzahlEndgueltigMitVorlaeufigerStimmeingabeVergleichPlausis(model, context);

    addPlausiWaehlerGesamtGroesserNull(model, context);
  }

  private void fillUrnenwahlbezirkKopfzahlVergleichPlausis(StimmeingabeKopfzahlErfassenModel model, StimmeingabePlausiBuilderContext context) {
    addUrnenwahlbezirkWahlberechtigteGesamtGroesserNullPlausi(model, context);
    addUrnenwahlbezirkWahlbeteiligungGesamtPlausis(0.50D, 0.95D, model, context);

    if (isWaehlerGesamtZuPlausibilisieren(model)) {
      model.getWahlberechtigteGesamtStimmeingabe()
          .ifPresent(stimmeingabeWahlberechtigteGesamt -> addPlausiKopfzahl(model.getWaehlerGesamt(),
              new StimmeingabeAnzahlKleinerGleichWahlberechtigteGesamtAnzahlPlausi(StimmeingabeAnzahlReference.SYSTEM_GRUPPE_WAEHLER_GESAMT, stimmeingabeWahlberechtigteGesamt,
                  findStimmeingabePlausiKonfigurationOrDefaults(context, StimmeingabePlausiTyp.WAEHLER_GESAMT_ANZAHL_KLEINER_GLEICH_WAHLBERECHTIGTE_GESAMT_ANZAHL, StimmeingabePlausiFehlerart.WARNING),
                  getMessages()),
              context));
    }

    addPlausiWaehlerMitWahlscheinInUrnenwahlAnzahlAusBriefwahl(model, context);

    addPlausiWaehlerOhneWahlscheinBerechnetKleinerGleichWahlberechtigteOhneWahlschein(model, context);
    addPlausiWaehlerOhneWahlscheinBerechnetKleinerWahlberechtigteOhneWahlscheinAnteil(model, context, 0.98D);

    addPlausiWaehlerMitWahlscheinKleinerGleichWaehlerGesamt(model, context);
    addPlausiWaehlerMitWahlscheinKleinerWahlberechtigteMitWahlschein(model, context, true);
    addPlausiWaehlerMitWahlscheinKleinerWahlberechtigteMitWahlscheinAnteil(model, context, true, 0.95D);
  }
}
