
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
    //  },
    //  @Deprecated // 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();
}
