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

import de.ivu.elect.business.exchange.control.AbstractExchangeContext;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.stimmeingabe.entity.*;
import de.ivu.elect.business.system.entity.ElectSimplePrincipal;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;

import javax.annotation.Nullable;

public class StimmeingabeImportContext extends AbstractExchangeContext {

  private static final long serialVersionUID = 1L;

  private final Wahldurchfuehrung wahldurchfuehrung;

  private final Mandant mandant;

  private final ErgebniseingangErfasser erfasser;

  private String originalDateiname = null;

  private boolean plausibilisierungErzwingen = false;

  private boolean plausibilisierungKannFehlerBestaetigen = false;

  private boolean gebieteMitLeerenEingaengenZuruecksetzen = false;

  private boolean erfassungInAnderenGebietenUebernehmen = false;

  private boolean erfassungsstatusUebernehmen = false;

  private StimmeingabeImportUmgangFehlendeGebiete umgangFehlendeGebiete = StimmeingabeImportUmgangFehlendeGebiete.FEHLER;

  private StimmeingabeImportUmgangNichtZugelasseneKandidaten umgangNichtZugelasseneKandidaten = StimmeingabeImportUmgangNichtZugelasseneKandidaten.ALS_FEHLEND_BETRACHTEN;

  private StimmeingabeImportUmgangFehlendeKandidaten umgangFehlendeKandidaten = StimmeingabeImportUmgangFehlendeKandidaten.FEHLER;

  // HACK, Pattern nicht weiter nutzen(!)
  private final StimmeingabeImportContainer stimmeingabeImportContainer = new StimmeingabeImportContainer();

  public StimmeingabeImportContext(Wahldurchfuehrung wahldurchfuehrung) {
    this(wahldurchfuehrung, ErgebniseingangErfasser.benutzerOrDefault());
  }

  public StimmeingabeImportContext(Wahldurchfuehrung wahldurchfuehrung, ElectSimplePrincipal principal) {
    this(wahldurchfuehrung, ErgebniseingangErfasser.benutzer(principal));
  }

  public StimmeingabeImportContext(Wahldurchfuehrung wahldurchfuehrung, ErgebniseingangErfasser erfasser) {
    super();

    this.wahldurchfuehrung = wahldurchfuehrung;

    this.mandant = wahldurchfuehrung != null ? wahldurchfuehrung.getMandant() : null; // lazy-loading...

    this.erfasser = erfasser;
  }

  public Wahldurchfuehrung getWahldurchfuehrung() {
    return wahldurchfuehrung;
  }

  public Mandant getMandant() {
    return mandant;
  }

  public ErgebniseingangErfasser getImportErfasser() {
    return erfasser;
  }

  @Nullable
  public String getOriginalDateiname() {
    return originalDateiname;
  }

  public void setOriginalDateiname(@Nullable String originalDateiname) {
    this.originalDateiname = originalDateiname;
  }

  public boolean isPlausibilisierungErzwingen() {
    return plausibilisierungErzwingen;
  }

  public void setPlausibilisierungErzwingen(boolean plausibilisierungErzwingen) {
    this.plausibilisierungErzwingen = plausibilisierungErzwingen;
  }

  public boolean isPlausibilisierungKannFehlerBestaetigen() {
    return plausibilisierungKannFehlerBestaetigen;
  }

  public void setPlausibilisierungKannFehlerBestaetigen(boolean plausibilisierungKannFehlerBestaetigen) {
    this.plausibilisierungKannFehlerBestaetigen = plausibilisierungKannFehlerBestaetigen;
  }

  public StimmeingabeImportUmgangFehlendeGebiete getUmgangFehlendeGebiete() {
    return umgangFehlendeGebiete;
  }

  public void setUmgangFehlendeGebiete(StimmeingabeImportUmgangFehlendeGebiete umgangFehlendeGebiete) {
    this.umgangFehlendeGebiete = umgangFehlendeGebiete;
  }

  public StimmeingabeImportUmgangNichtZugelasseneKandidaten getUmgangNichtZugelasseneKandidaten() {
    return umgangNichtZugelasseneKandidaten;
  }

  public void setUmgangNichtZugelasseneKandidaten(StimmeingabeImportUmgangNichtZugelasseneKandidaten umgangNichtZugelasseneKandidaten) {
    this.umgangNichtZugelasseneKandidaten = umgangNichtZugelasseneKandidaten;
  }

  public StimmeingabeImportUmgangFehlendeKandidaten getUmgangFehlendeKandidaten() {
    return umgangFehlendeKandidaten;
  }

  public void setUmgangFehlendeKandidaten(StimmeingabeImportUmgangFehlendeKandidaten umgangFehlendeKandidaten) {
    this.umgangFehlendeKandidaten = umgangFehlendeKandidaten;
  }


  public boolean isGebieteMitLeerenEingaengenZuruecksetzen() {
    return gebieteMitLeerenEingaengenZuruecksetzen;
  }

  public void setGebieteMitLeerenEingaengenZuruecksetzen(boolean gebieteMitLeerenEingaengenZuruecksetzen) {
    this.gebieteMitLeerenEingaengenZuruecksetzen = gebieteMitLeerenEingaengenZuruecksetzen;
  }

  public boolean isErfassungInAnderenGebietenUebernehmen() {
    return erfassungInAnderenGebietenUebernehmen;
  }

  public void setErfassungInAnderenGebietenUebernehmen(boolean erfassungInAnderenGebietenUebernehmen) {
    this.erfassungInAnderenGebietenUebernehmen = erfassungInAnderenGebietenUebernehmen;
  }

  public boolean isErfassungsstatusUebernehmen() {
    return erfassungsstatusUebernehmen;
  }

  public void setErfassungsstatusUebernehmen(boolean erfassungsstatusUebernehmen) {
    this.erfassungsstatusUebernehmen = erfassungsstatusUebernehmen;
  }

  public void setContextFuerWahlImport() {
    // ELECT-16450
    umgangFehlendeGebiete = StimmeingabeImportUmgangFehlendeGebiete.IGNORIEREN;
    umgangNichtZugelasseneKandidaten = StimmeingabeImportUmgangNichtZugelasseneKandidaten.IGNORIEREN;
    umgangFehlendeKandidaten = StimmeingabeImportUmgangFehlendeKandidaten.IGNORIEREN;

    // ELECT-16767 (kommt mit der Wahl)
    plausibilisierungErzwingen = false;
    gebieteMitLeerenEingaengenZuruecksetzen = false;
    erfassungInAnderenGebietenUebernehmen = false;
    erfassungsstatusUebernehmen = false;
  }

  public StimmeingabeImportContainer getStimmeingabeImportContainer() {
    return stimmeingabeImportContainer;
  }

  @Override
  public String toString() {
    return "StimmeingabeImportContext{" +
        "wahldurchfuehrung=" + wahldurchfuehrung +
        ", mandant=" + mandant +
        ", erfasser=" + erfasser +
        ", originalDateiname='" + originalDateiname + '\'' +
        ", plausibilisierungErzwingen=" + plausibilisierungErzwingen +
        ", plausibilisierungKannFehlerBestaetigen=" + plausibilisierungKannFehlerBestaetigen +
        ", gebieteMitLeerenEingaengenZuruecksetzen=" + gebieteMitLeerenEingaengenZuruecksetzen +
        ", erfassungInAnderenGebietenUebernehmen=" + erfassungInAnderenGebietenUebernehmen +
        ", erfassungsstatusUebernehmen=" + erfassungsstatusUebernehmen +
        ", umgangFehlendeGebiete=" + umgangFehlendeGebiete +
        ", umgangNichtZugelasseneKandidaten=" + umgangNichtZugelasseneKandidaten +
        ", umgangFehlendeKandidaten=" + umgangFehlendeKandidaten +
        ", stimmeingabeImportContainer=" + stimmeingabeImportContainer +
        ", importErfasser=" + getImportErfasser() +
        "} " + super.toString();
  }
}
