
package de.ivu.elect.dokumente.ergebnis;

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformation;
import de.ivu.elect.business.gebietsbaum.entity.Verwaltungsart;

public class ErgebnisDocumentDatenGebietDocument extends ErgebnisDocumentGebietDocument {

  private static final long serialVersionUID = 1L;

  private static final String SUMMEN_GEBIET_GESAMT_NAME_PREFIX = "Gesamt";

  private static final String SUMMEN_GEBIET_GESAMT_KUERZEL = "SUMMEN_GEBIET_GESAMT";

  private static final WahlverwaltungGebietInformation SUMMEN_GEBIET_GEMEINDEN_GESAMT = new WahlverwaltungGebietInformation(Verwaltungsart.GEMEINDE, SUMMEN_GEBIET_GESAMT_NAME_PREFIX, "",
      SUMMEN_GEBIET_GESAMT_KUERZEL);

  @DocumentComplexField("Stimmzettelgebiet") // ELECT-16412
  public ErgebnisDocumentGebietDocument stimmzettelgebiet;

  @DocumentSimpleField("Ist-Ergebniseingang-Ausstehend") // ELECT-16559
  public boolean isErgebniseingangAusstehend;

  @DocumentSimpleField("Ist-Ergebniseingabestatus-Komplett-Eingabe-Beendet")
  public boolean isErgebniseingabestatusKomplettEingabeBeendet;

  @DocumentSimpleField("Ist-Ergebniseingabestatus-Komplett-Gesperrt")
  public boolean isErgebniseingabestatusKomplettGesperrt;

  @DocumentSimpleField("Ist-Ergebniseingabestatus-Komplett-Abgeschlossen")
  public boolean isErgebniseingabestatusKomplettAbgeschlossen;

  @DocumentSimpleField("Ist-Ergebniseingabestatus-Komplett-Freigegeben")
  public boolean isErgebniseingabestatusKomplettFreigegeben;

  @DocumentSimpleField("Ist-Ergebniseingabestatus-Komplett-Ausbleibend")
  public boolean isErgebniseingabestatusKomplettAusbleibend;

  @DocumentSimpleField("Ist-Pseudo-Gemeinde-Gesamt")
  public boolean isPseudoGemeindeGesamt;

  public ErgebnisDocumentDatenGebietDocument() {
    this(new WahlverwaltungGebietInformation(Verwaltungsart.OHNE, "", "", ""), "", "", "", "", "");
  }

  public ErgebnisDocumentDatenGebietDocument(WahlverwaltungGebietInformation stimmzettelgebietInformation, WahlverwaltungGebietInformation gebietInformation) {
    this(stimmzettelgebietInformation, gebietInformation.getArt().name(), gebietInformation.getName(), gebietInformation.getNummer(), gebietInformation.getNummer(), gebietInformation.getKuerzel());
  }

  public ErgebnisDocumentDatenGebietDocument(WahlverwaltungGebietInformation stimmzettelgebietInformation, String art, String name, String nummer, String nummerFormatiert, String kuerzel) {
    super(art, name, nummer, nummerFormatiert, kuerzel);

    this.stimmzettelgebiet = new ErgebnisDocumentGebietDocument(stimmzettelgebietInformation);

    this.isErgebniseingangAusstehend = false;

    this.isErgebniseingabestatusKomplettEingabeBeendet = false;
    this.isErgebniseingabestatusKomplettGesperrt = false;
    this.isErgebniseingabestatusKomplettAbgeschlossen = false;
    this.isErgebniseingabestatusKomplettFreigegeben = false;
    this.isErgebniseingabestatusKomplettAusbleibend = false;

    this.isPseudoGemeindeGesamt = SUMMEN_GEBIET_GESAMT_KUERZEL.equals(kuerzel);
  }

  @Override
  public ErgebnisDocumentDatenGebietDocument copy() {
    return copy(new ErgebnisDocumentDatenGebietDocument());
  }

  protected ErgebnisDocumentDatenGebietDocument copy(ErgebnisDocumentDatenGebietDocument target) {
    super.copy(target);

    target.stimmzettelgebiet = stimmzettelgebiet.copy();

    target.art = art;

    target.isErgebniseingangAusstehend = isErgebniseingangAusstehend;

    target.isErgebniseingabestatusKomplettEingabeBeendet = isErgebniseingabestatusKomplettEingabeBeendet;
    target.isErgebniseingabestatusKomplettGesperrt = isErgebniseingabestatusKomplettGesperrt;
    target.isErgebniseingabestatusKomplettAbgeschlossen = isErgebniseingabestatusKomplettAbgeschlossen;
    target.isErgebniseingabestatusKomplettFreigegeben = isErgebniseingabestatusKomplettFreigegeben;
    target.isErgebniseingabestatusKomplettAusbleibend = isErgebniseingabestatusKomplettAusbleibend;

    target.isPseudoGemeindeGesamt = isPseudoGemeindeGesamt;

    return target;
  }

  public static WahlverwaltungGebietInformation createSummenGebietKreisGesamt(WahlverwaltungGebietInformation kreisInformation) {
    String kreisNummer = kreisInformation.getNummer();
    String kreisBezeichnung = kreisInformation.getName();

    if (isBlank(kreisBezeichnung)) {
      kreisBezeichnung = "Kreis";

      if (isNotBlank(kreisNummer)) {
        kreisBezeichnung += " " + kreisNummer;
      }
    }

    return new WahlverwaltungGebietInformation(kreisInformation.getArt(), ErgebnisDocumentDatenGebietDocument.SUMMEN_GEBIET_GESAMT_NAME_PREFIX + " (" + kreisBezeichnung + ")", kreisNummer,
        ErgebnisDocumentDatenGebietDocument.SUMMEN_GEBIET_GESAMT_KUERZEL);
  }

  public static WahlverwaltungGebietInformation createSummenGebietGemeindenGesamt() {
    return SUMMEN_GEBIET_GEMEINDEN_GESAMT;
  }
}
