
package de.ivu.elect.presentation.ergebnis;

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.control.ErgebnisAuszaehlungsstandErmittler;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.Icons;

public class ErgebnisAuszaehlungsstand {

  private final Wahl wahl;

  private final Gebiet gebiet;

  private final Ergebnis ergebnis;

  private final ErgebnisAuszaehlungsstandErmittler ergebnisAuszaehlungsstandErmittler;

  private final Messages messages;

  private final Icons icons;

  private final WasErgebnisStatusInfo ergebnisStatusInfo;

  private Long anzahlErfassungseinheitenGesamt;

  private Long anzahlErfassungseinheitenAusgezaehlt;

  public ErgebnisAuszaehlungsstand(@Nullable Wahl wahl, @Nullable Gebiet gebiet, @Nullable Ergebnis ergebnis, ErgebniseingangKonfiguration ergebniseingangKonfiguration,
      ErgebnisAuszaehlungsstandErmittler ergebnisAuszaehlungsstandErmittler, Messages messages, Icons icons) {
    super();

    this.wahl = wahl;
    this.gebiet = gebiet;
    this.ergebnis = ergebnis;

    this.ergebnisAuszaehlungsstandErmittler = ergebnisAuszaehlungsstandErmittler;

    this.ergebnisStatusInfo = new WasErgebnisStatusInfo(messages, wahl, ergebniseingangKonfiguration, ergebnis);

    this.messages = messages;
    this.icons = icons;
  }

  public Ergebnis getErgebnis() {
    return ergebnis;
  }

  public String getErgebnisName() {
    if (ergebnis == null) {
      return ""; // ELECT-8722
    }

    return ergebnis.getName();
  }

  // ELECT-13716
  public String getErgebnisHinweis() {
    return ergebnisStatusInfo.getErgebnisHinweis();
  }

  public void clearAnzahlenErfassungseinheiten() {
    anzahlErfassungseinheitenGesamt = null;
    anzahlErfassungseinheitenAusgezaehlt = null;
  }

  public long getAnzahlErfassungseinheitenGesamt() {
    if (anzahlErfassungseinheitenGesamt == null) {
      anzahlErfassungseinheitenGesamt = berechneAnzahlErfassungseinheitenGesamt();
    }

    return anzahlErfassungseinheitenGesamt;
  }

  private long berechneAnzahlErfassungseinheitenGesamt() {
    if (gebiet == null || wahl == null) {
      return 0L;
    }

    if (gebiet.isWurzelgebiet()) {
      return ergebnisAuszaehlungsstandErmittler.getAnzahlErfassungsgebieteFuerWurzelgebiet(wahl);
    }

    return ergebnisAuszaehlungsstandErmittler.getAnzahlErfassungsgebieteFuerGebiet(wahl, gebiet);
  }

  public long getAnzahlErfassungseinheitenAusgezaehlt() {
    if (anzahlErfassungseinheitenAusgezaehlt == null) {
      anzahlErfassungseinheitenAusgezaehlt = berechneAnzahlErfassungseinheitenAusgezaehlt();
    }

    return anzahlErfassungseinheitenAusgezaehlt;
  }

  private long berechneAnzahlErfassungseinheitenAusgezaehlt() {
    if (gebiet == null || ergebnis == null) {
      return 0L;
    }

    if (gebiet.isWurzelgebiet()) {
      return ergebnisAuszaehlungsstandErmittler.getAnzahlGueltigeErgebniseingaengeFuerErgebnisUndWurzelgebiet(getErgebnis());
    }

    return ergebnisAuszaehlungsstandErmittler.getAnzahlGueltigeErgebniseingaengeFuerErgebnisUndGebiet(getErgebnis(), gebiet);
  }

  public String getStyleClassAuszaehlungsstand() {
    return icons.getIconStatus((double) getAnzahlErfassungseinheitenAusgezaehlt() / (double) getAnzahlErfassungseinheitenGesamt());
  }
}
