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

import java.util.ArrayList;
import java.util.List;

import de.ivu.document.generator.template.BaseDocument;
import de.ivu.document.generator.template.annotations.DocumentComplexField;
import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.niederschrift.boundary.NiederschriftFormatter;
import de.ivu.elect.business.niederschrift.entity.Niederschrift;
import de.ivu.elect.business.niederschrift.entity.NiederschriftArt;
import de.ivu.elect.business.niederschrift.entity.NiederschriftKorrektur;
import de.ivu.elect.dokumente.BaseElectContext;
import de.ivu.elect.dokumente.gebiet.GebietDokument;
import de.ivu.elect.dokumente.stimmzettel.StimmzettelExportCodeFont;

public class NiederschriftDocument extends BaseDocument {

  private static final long serialVersionUID = 1L;

  @DocumentComplexField("Gebiet")
  public final GebietDokument gebiet;

  @DocumentSimpleField("Art")
  public final String art;

  @DocumentSimpleField("Kuerzel-Schnelleingabe-Wahl-Inklusive")
  public final String kuerzelSchnelleingabeWahlIncluded;

  @DocumentSimpleField("Kuerzel-Schnelleingabe-Wahl-Inklusive-Barcode")
  public final String kuerzelSchnelleingabeWahlIncludedCodeFontContentCode128;

  @DocumentSimpleField("Kuerzel-Schnelleingabe-Wahl-Exklusive")
  public final String kuerzelSchnelleingabeWahlExcluded;

  @DocumentSimpleField("Kuerzel-Schnelleingabe-Wahl-Exklusive-Barcode")
  public final String kuerzelSchnelleingabeWahlExcludedCodeFontContentCode128;

  @DocumentSimpleField("IstNiederschrift")
  public final boolean isNiederschrift;

  @DocumentSimpleField("IstSchnellmeldung")
  public final boolean isSchnellmeldung;

  @DocumentSimpleField("IstVerhandlungstasche")
  public final boolean isVerhandlungstasche;

  @DocumentSimpleField("IstKorrekturVorhanden")
  public final boolean isKorrekturVorhanden;

  @DocumentSimpleField("IstRechnerischeKorrekturVorhanden")
  public final boolean isRechnerischeKorrekturVorhanden;

  @DocumentSimpleField("IstNachzaehlungVorhanden")
  public final boolean isNachzaehlungVorhanden;

  @DocumentRepeat(value = "Korrekturen", elementClass = NiederschriftenKorrekturDocument.class, itemName = "korrektur")
  public final List<NiederschriftenKorrekturDocument> korrekturen;

  public NiederschriftDocument(BaseElectContext baseElectContext, NiederschriftFormatter niederschriftFormatter, Niederschrift niederschrift) {
    super();

    this.gebiet = new GebietDokument(baseElectContext, niederschrift.getGebiet());

    NiederschriftArt niederschriftArt = niederschrift.getNiederschriftArt();

    this.art = baseElectContext.getMessage(niederschriftArt);

    this.kuerzelSchnelleingabeWahlIncluded = niederschriftFormatter.formatKuerzelSchnelleingabeWahlIncluded(niederschrift).getValueFormatted();
    this.kuerzelSchnelleingabeWahlExcluded = niederschriftFormatter.formatKuerzelSchnelleingabeWahlExcluded(niederschrift).getValueFormatted();

    // ELECTMUC-2756
    StimmzettelExportCodeFont stimmzettelExportCodeFontCode128 = StimmzettelExportCodeFont.BARCODE_CODE_128_B_BY_WILL_SOFTWARE;
    this.kuerzelSchnelleingabeWahlIncludedCodeFontContentCode128 = stimmzettelExportCodeFontCode128.encode(this.kuerzelSchnelleingabeWahlIncluded);
    this.kuerzelSchnelleingabeWahlExcludedCodeFontContentCode128 = stimmzettelExportCodeFontCode128.encode(this.kuerzelSchnelleingabeWahlExcluded);

    this.isNiederschrift = niederschriftArt.isNiederschrift();
    this.isSchnellmeldung = niederschriftArt.isSchnellmneldung();
    this.isVerhandlungstasche = niederschriftArt.isVerhandlungstasche();

    this.korrekturen = erzeugeKorrekturen(baseElectContext, niederschrift);

    this.isRechnerischeKorrekturVorhanden = bestimmeIsRechnerischeKorrekturVorhanden(korrekturen);
    this.isNachzaehlungVorhanden = bestimmeIsNachzaehlungVorhanden(korrekturen);

    this.isKorrekturVorhanden = isRechnerischeKorrekturVorhanden || isNachzaehlungVorhanden;
  }

  private boolean bestimmeIsNachzaehlungVorhanden(List<NiederschriftenKorrekturDocument> korrekturen) {
    for (NiederschriftenKorrekturDocument niederschriftenKorrekturDocument : korrekturen) {
      if (niederschriftenKorrekturDocument.isNachzaehlung) {
        return true;
      }
    }

    return false;
  }

  private boolean bestimmeIsRechnerischeKorrekturVorhanden(List<NiederschriftenKorrekturDocument> korrekturen) {
    for (NiederschriftenKorrekturDocument niederschriftenKorrekturDocument : korrekturen) {
      if (niederschriftenKorrekturDocument.isRechnerischeKorrektur) {
        return true;
      }

    }

    return false;
  }

  private List<NiederschriftenKorrekturDocument> erzeugeKorrekturen(BaseElectContext baseElectContext, Niederschrift niederschrift) {
    List<NiederschriftenKorrekturDocument> result = new ArrayList<>();

    for (NiederschriftKorrektur niederschriftKorrektur : niederschrift.getNiederschriftKorrekturenSortiertNachZeitstempelAufsteigend()) {
      result.add(new NiederschriftenKorrekturDocument(baseElectContext, niederschriftKorrektur));
    }

    return result;
  }
}
