
package de.ivu.elect.business.wahl.entity;

import java.util.function.BooleanSupplier;

/**
 * ELECT-9522
 */
public enum UmgangHinterlegteAWerte {

  NUR_URNENWAHLBEZIRKE {

    @Override
    public boolean isErfassungMoeglich(BooleanSupplier isBriefwahlgebiet, BooleanSupplier hasGebietsartErfassungsgebiet) {
      return !isBriefwahlgebiet.getAsBoolean() && hasGebietsartErfassungsgebiet.getAsBoolean();
    }

    @Override
    public boolean isAnzahlWahlberechtigeOhneWahlscheinReadOnly(BooleanSupplier isBriefwahlgebiet) {
      return false; // egal
    }

    @Override
    public boolean isErfassungGesperrt(BooleanSupplier isErfassungGesperrtByGebietsart, BooleanSupplier isErfassungGesperrtByErgebniseingang) {
      return isErfassungGesperrtByGebietsart.getAsBoolean() || isErfassungGesperrtByErgebniseingang.getAsBoolean();
    }

    @Override
    public boolean isAktualisiereAWerteFuerUebergeordneteGebiete() {
      return true;
    }

    @Override
    public boolean isErfassungMoeglichNurFuerErfassungsgebiete() {
      return true;
    }
  },
  URNEN_UND_BRIEFWAHLBEZIRKE {

    @Override
    public boolean isErfassungMoeglich(BooleanSupplier isBriefwahlgebiet, BooleanSupplier hasGebietsartErfassungsgebiet) {
      return hasGebietsartErfassungsgebiet.getAsBoolean();
    }

    @Override
    public boolean isAnzahlWahlberechtigeOhneWahlscheinReadOnly(BooleanSupplier isBriefwahlgebiet) {
      return isBriefwahlgebiet.getAsBoolean();
    }

    @Override
    public boolean isErfassungGesperrt(BooleanSupplier isErfassungGesperrtByGebietsart, BooleanSupplier isErfassungGesperrtByErgebniseingang) {
      return isErfassungGesperrtByGebietsart.getAsBoolean() || isErfassungGesperrtByErgebniseingang.getAsBoolean();
    }

    @Override
    public boolean isAktualisiereAWerteFuerUebergeordneteGebiete() {
      return true;
    }

    @Override
    public boolean isErfassungMoeglichNurFuerErfassungsgebiete() {
      return true;
    }
  },
  FREIE_EINGABE {

    @Override
    public boolean isErfassungMoeglich(BooleanSupplier isBriefwahlgebiet, BooleanSupplier hasGebietsartErfassungsgebiet) {
      return true;
    }

    @Override
    public boolean isAnzahlWahlberechtigeOhneWahlscheinReadOnly(BooleanSupplier isBriefwahlgebiet) {
      return false;
    }

    @Override
    public boolean isErfassungGesperrt(BooleanSupplier isErfassungGesperrtByGebietsart, BooleanSupplier isErfassungGesperrtByErgebniseingang) {
      return false; // immer möglich...
    }

    @Override
    public boolean isAktualisiereAWerteFuerUebergeordneteGebiete() {
      return false;
    }

    @Override
    public boolean isErfassungMoeglichNurFuerErfassungsgebiete() {
      return false;
    }
  },

  // ELECT-9544
  //  FREIE_EINGABE_MIT_KUMULATION {
  //
  //    @Override
  //    public boolean isErfassungMoeglich(BooleanSupplier isBriefwahlgebiet, BooleanSupplier hasGebietsartErfassungsgebiet) {
  //      return FREIE_EINGABE.isErfassungMoeglich(isBriefwahlgebiet, hasGebietsartErfassungsgebiet);
  //    }
  //
  //    @Override
  //    public boolean isAnzahlWahlberechtigeOhneWahlscheinReadOnly(BooleanSupplier isBriefwahlgebiet) {
  //      return FREIE_EINGABE.isAnzahlWahlberechtigeOhneWahlscheinReadOnly(isBriefwahlgebiet);
  //    }
  //
  //    @Override
  //    public boolean isErfassungGesperrt(BooleanSupplier isErfassungGesperrtByGebietsart, BooleanSupplier isErfassungGesperrtByErgebniseingang) {
  //      return FREIE_EINGABE.isErfassungGesperrt(isErfassungGesperrtByGebietsart, isErfassungGesperrtByErgebniseingang);
  //    }
  //
  //    @Override
  //    public boolean isAktualisiereAWerteFuerUebergeordneteGebiete() {
  //      return true;
  //    }
  //  }

  ;

  public abstract boolean isAnzahlWahlberechtigeOhneWahlscheinReadOnly(BooleanSupplier isBriefwahlgebiet);

  public abstract boolean isErfassungMoeglich(BooleanSupplier isBriefwahlgebiet, BooleanSupplier hasGebietsartErfassungsgebiet);

  public abstract boolean isErfassungMoeglichNurFuerErfassungsgebiete();

  public abstract boolean isErfassungGesperrt(BooleanSupplier isErfassungGesperrtByGebietsart, BooleanSupplier isErfassungGesperrtByErgebniseingang);

  public abstract boolean isAktualisiereAWerteFuerUebergeordneteGebiete();
}
