
package de.ivu.elect.was.exchange.ergebnis.zusammenstellung;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;

public class ErgebnisZusammenstellungErfassung {

  private final boolean ergebniseingangAusstehend;

  private final boolean ergebniseingabestatusEingabeBeendet;

  private final boolean ergebniseingabestatusGesperrt;

  private final boolean ergebniseingabestatusAbgeschlossen;

  private final boolean ergebniseingabestatusFreigegeben;

  private final boolean ergebniseingabestatusAusbleibend;

  public ErgebnisZusammenstellungErfassung(WahlartErgebnisart ergebnisart, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, boolean ergebniseingangAusstehend) {
    this( //
        ergebniseingangAusstehend, // ELECT-16559
        wahldurchfuehrungsgebiet.matchesAnyErgebniseingabestatusInUebergeordneterGebietshierarchie(ergebnisart, Ergebniseingabestatus::isEingabeBeendet), //
        wahldurchfuehrungsgebiet.matchesAnyErgebniseingabestatusInUebergeordneterGebietshierarchie(ergebnisart, Ergebniseingabestatus::isGesperrt), //
        wahldurchfuehrungsgebiet.matchesAnyErgebniseingabestatusInUebergeordneterGebietshierarchie(ergebnisart, Ergebniseingabestatus::isAbgeschlossen), //
        wahldurchfuehrungsgebiet.matchesAnyErgebniseingabestatusInUebergeordneterGebietshierarchie(ergebnisart, Ergebniseingabestatus::isFreigegeben), //
        wahldurchfuehrungsgebiet.matchesAnyErgebniseingabestatusInUebergeordneterGebietshierarchie(ergebnisart, Ergebniseingabestatus::isAusbleibend) //
    );
  }

  public ErgebnisZusammenstellungErfassung(boolean ergebniseingangAusstehend, boolean ergebniseingabestatusEingabeBeendet, boolean ergebniseingabestatusGesperrt,
      boolean ergebniseingabestatusAbgeschlossen, boolean ergebniseingabestatusFreigegeben, boolean ergebniseingabestatusAusbleibend) {
    super();

    this.ergebniseingangAusstehend = ergebniseingangAusstehend;

    this.ergebniseingabestatusEingabeBeendet = ergebniseingabestatusEingabeBeendet;
    this.ergebniseingabestatusGesperrt = ergebniseingabestatusGesperrt;
    this.ergebniseingabestatusAbgeschlossen = ergebniseingabestatusAbgeschlossen;
    this.ergebniseingabestatusFreigegeben = ergebniseingabestatusFreigegeben;
    this.ergebniseingabestatusAusbleibend = ergebniseingabestatusAusbleibend;
  }

  public boolean isErgebniseingangAusstehend() {
    return ergebniseingangAusstehend;
  }

  public boolean isEingabeBeendet() {
    return ergebniseingabestatusEingabeBeendet;
  }

  public boolean isGesperrt() {
    return ergebniseingabestatusGesperrt;
  }

  public boolean isAbgeschlossen() {
    return ergebniseingabestatusAbgeschlossen;
  }

  public boolean isAusbleibend() {
    return ergebniseingabestatusAusbleibend;
  }

  public boolean isFreigegeben() {
    return ergebniseingabestatusFreigegeben;
  }

  public ErgebnisZusammenstellungErfassung add(ErgebnisZusammenstellungErfassung another) {
    return sum(this, another);
  }

  private static ErgebnisZusammenstellungErfassung sum(ErgebnisZusammenstellungErfassung one, ErgebnisZusammenstellungErfassung another) {
    return new ErgebnisZusammenstellungErfassung( //
        one.isErgebniseingangAusstehend() && another.isErgebniseingangAusstehend(), //
        one.isEingabeBeendet() && another.isEingabeBeendet(), //
        one.isGesperrt() && another.isGesperrt(), //
        one.isAbgeschlossen() && another.isAbgeschlossen(), //
        one.isFreigegeben() && another.isFreigegeben(), //
        one.isAusbleibend() && another.isAusbleibend() //
    );
  }
}
