
package de.ivu.elect.presentation.ergebnis.dokumente.gesamtergebnis;

import static de.ivu.elect.dokumente.DokumentFormatter.formatNumber;

import java.util.Locale;
import java.util.Objects;

import javax.annotation.Nullable;

import de.ivu.document.generator.template.annotations.DocumentMethod;
import de.ivu.document.generator.template.annotations.DocumentParam;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.dokumente.ElectDocument;
import de.ivu.elect.dokumente.WasElectContext;

public class GesamtErgebnisVergleichEingabeDokument extends ElectDocument {

  private static final long serialVersionUID = 1L;

  static final Long ANZAHL_UNBEKANNT = Long.MIN_VALUE;

  static final Long DIFFERENZ_UNBEKANNT = null;

  @DocumentSimpleField("Anzahl-Vorlaeufig-Ist-Vorhanden")
  public final boolean anzahlVorlaeufigIstVorhanden;

  @DocumentSimpleField("Anzahl-Vorlaeufig")
  public final Long anzahlVorlaeufig;

  @DocumentSimpleField("Anzahl-Vorlaeufig-Formatiert")
  public final String anzahlVorlaeufigFormatiert;

  @DocumentSimpleField("Anzahl-Endgueltig-Ist-Vorhanden")
  public final boolean anzahlEndgueltigIstVorhanden;

  @DocumentSimpleField("Anzahl-Endgueltig")
  public final Long anzahlEndgueltig;

  @DocumentSimpleField("Anzahl-Endgueltig-Formatiert")
  public final String anzahlEndgueltigFormatiert;

  @DocumentSimpleField("Differenz-Ist-Vorhanden")
  public final boolean differenzIstVorhanden;

  @DocumentSimpleField("Differenz-Vorlaeufig-Endgueltig")
  public final Long differenzVorlaeufigEndgueltig;

  @DocumentSimpleField("Differenz-Vorlaeufig-Endgueltig-Formatiert")
  public final String differenzVorlaeufigEndgueltigFormatiert;

  @DocumentSimpleField("Differenz-Endgueltig-Vorlaeufig")
  public final Long differenzEndgueltigVorlaeufig;

  @DocumentSimpleField("Differenz-Endgueltig-Vorlaeufig-Formatiert")
  public final String differenzEndgueltigVorlaeufigFormatiert;

  public GesamtErgebnisVergleichEingabeDokument(WasElectContext wasElectContext, Long anzahlVorlaeufig, Long anzahlEndgueltig) {
    this(wasElectContext, !Objects.equals(anzahlVorlaeufig, ANZAHL_UNBEKANNT), anzahlVorlaeufig, !Objects.equals(anzahlEndgueltig, ANZAHL_UNBEKANNT), anzahlEndgueltig);
  }

  private GesamtErgebnisVergleichEingabeDokument(WasElectContext wasElectContext, boolean anzahlVorlaeufigIstVorhanden, Long anzahlVorlaeufig, boolean anzahlEndgueltigIstVorhanden,
      Long anzahlEndgueltig) {
    super(wasElectContext);

    Locale locale = wasElectContext.getLocale();

    this.anzahlVorlaeufigIstVorhanden = anzahlVorlaeufigIstVorhanden;
    this.anzahlVorlaeufig = anzahlVorlaeufigIstVorhanden ? anzahlVorlaeufig == null ? 0L : anzahlVorlaeufig : null;
    this.anzahlVorlaeufigFormatiert = formatNumber(this.anzahlVorlaeufig, locale);

    this.anzahlEndgueltigIstVorhanden = anzahlEndgueltigIstVorhanden;
    this.anzahlEndgueltig = anzahlEndgueltigIstVorhanden ? anzahlEndgueltig == null ? 0L : anzahlEndgueltig : null;
    this.anzahlEndgueltigFormatiert = formatNumber(this.anzahlEndgueltig, locale);

    this.differenzVorlaeufigEndgueltig = getDifferenz(this.anzahlVorlaeufig, this.anzahlEndgueltig);
    this.differenzVorlaeufigEndgueltigFormatiert = formatDifferenz(this.differenzVorlaeufigEndgueltig);

    this.differenzEndgueltigVorlaeufig = getDifferenz(this.anzahlEndgueltig, this.anzahlVorlaeufig);
    this.differenzEndgueltigVorlaeufigFormatiert = formatDifferenz(this.differenzEndgueltigVorlaeufig);

    this.differenzIstVorhanden = anzahlVorlaeufigIstVorhanden && anzahlEndgueltigIstVorhanden && !Objects.equals(this.differenzVorlaeufigEndgueltig, DIFFERENZ_UNBEKANNT)
        && !Objects.equals(this.differenzVorlaeufigEndgueltig, 0L); // ELECTKOM-1621
  }

  @Nullable
  @DocumentMethod
  public Long getDifferenz(@DocumentParam("Aktuell") @Nullable Long aktuell, @DocumentParam("Vergleich") @Nullable Long vergleich) {
    Long differenz = DIFFERENZ_UNBEKANNT;

    if (aktuell != null && vergleich != null) {
      differenz = aktuell - vergleich;
    }

    return differenz;
  }

  @DocumentMethod
  public String formatDifferenz(@DocumentParam("Aktuell") @Nullable Long aktuell, @DocumentParam("Vergleich") @Nullable Long vergleich) {
    return formatDifferenz(getDifferenz(aktuell, vergleich));
  }

  private String formatDifferenz(@Nullable Long differenz) {
    return format.formatStimmzahlDifferenz(differenz);
  }
}
