
package de.ivu.elect.business.ergebnis.control.gesamtergebnis;

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.ergebnis.control.ErgebnisExchangeContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisdokumentTypExportContext;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.jee.faces.Messages;

public class ErgebnisGesamtergebnisTabellarischDocumentExportContext extends ErgebnisdokumentTypExportContext {

  private static final long serialVersionUID = 1L;

  public static final int DOKUMENT_VORLAGE_ANZAHL_ZEILEN_PRO_SEITE_DEFAULT_VALUE = 25;

  // Cf. https://www.wahlen.bayern.de/lw2018/StMI/22_V7-Zus-stellung-endgErg_LT-Bz.pdf.
  public static final int DOKUMENT_VORLAGE_ERSTE_SEITE_ANZAHL_SPALTEN_DEFAULT_VALUE = 12;

  public static final int DOKUMENT_VORLAGE_WEITERE_SEITEN_ANZAHL_SPALTEN_DEFAULT_VALUE = 14;

  private final boolean documentsCreatedPerStimmzettelgebiet;

  private final boolean documentsCreatedPerGemeinde;

  private final boolean tabellenCreatedPerDatenArt;

  private final boolean tabellenCreatedPseudoGemeindeGesamt;

  private final int anzahlZeilenProSeite;

  private final DokumentVorlage dokumentVorlageGesamtergebnis;

  private final DokumentVorlage dokumentVorlageErsteSeiteDirektstimmen;

  private final DokumentVorlage dokumentVorlageErsteSeiteListenstimmen;

  private final int dokumentVorlageErsteSeiteAnzahlSpalten;

  private final DokumentVorlage dokumentVorlageWeitereSeitenDirektstimmen;

  private final DokumentVorlage dokumentVorlageWeitereSeitenListenstimmen;

  private final int dokumentVorlageWeitereSeitenAnzahlSpalten;

  public ErgebnisGesamtergebnisTabellarischDocumentExportContext(ErgebnisExchangeContext ergebnisExchangeContext, Ergebnis ergebnis, Benutzer benutzer, Messages messages,
      Boolean documentsCreatedPerStimmzettelgebiet, Boolean documentsCreatedPerGemeinde, Boolean tabellenCreatedPerDatenArt, Boolean tabellenCreatedPseudoGemeindeGesamt, Integer anzahlZeilenProSeite,
      DokumentVorlage dokumentVorlageGesamtergebnis, DokumentVorlage dokumentVorlageErsteSeiteDirektstimmen, DokumentVorlage dokumentVorlageErsteSeiteListenstimmen,
      Integer dokumentVorlageErsteSeiteAnzahlSpalten, DokumentVorlage dokumentVorlageWeitereSeitenDirektstimmen, DokumentVorlage dokumentVorlageWeitereSeitenListenstimmen,
      Integer dokumentVorlageWeitereSeitenAnzahlSpalten) {
    super(ergebnisExchangeContext, ergebnis, benutzer, messages);

    this.documentsCreatedPerStimmzettelgebiet = Boolean.TRUE.equals(documentsCreatedPerStimmzettelgebiet);
    this.documentsCreatedPerGemeinde = Boolean.TRUE.equals(documentsCreatedPerGemeinde);

    this.tabellenCreatedPerDatenArt = Boolean.TRUE.equals(tabellenCreatedPerDatenArt);
    this.tabellenCreatedPseudoGemeindeGesamt = Boolean.TRUE.equals(tabellenCreatedPseudoGemeindeGesamt);

    this.anzahlZeilenProSeite = fixNullToDefault(anzahlZeilenProSeite, DOKUMENT_VORLAGE_ANZAHL_ZEILEN_PRO_SEITE_DEFAULT_VALUE);

    this.dokumentVorlageGesamtergebnis = dokumentVorlageGesamtergebnis;

    this.dokumentVorlageErsteSeiteDirektstimmen = dokumentVorlageErsteSeiteDirektstimmen;
    this.dokumentVorlageErsteSeiteListenstimmen = dokumentVorlageErsteSeiteListenstimmen;
    this.dokumentVorlageErsteSeiteAnzahlSpalten = fixNullToDefault(dokumentVorlageErsteSeiteAnzahlSpalten, DOKUMENT_VORLAGE_ERSTE_SEITE_ANZAHL_SPALTEN_DEFAULT_VALUE);

    this.dokumentVorlageWeitereSeitenDirektstimmen = dokumentVorlageWeitereSeitenDirektstimmen;
    this.dokumentVorlageWeitereSeitenListenstimmen = dokumentVorlageWeitereSeitenListenstimmen;

    this.dokumentVorlageWeitereSeitenAnzahlSpalten = fixNullToDefault(dokumentVorlageWeitereSeitenAnzahlSpalten, DOKUMENT_VORLAGE_WEITERE_SEITEN_ANZAHL_SPALTEN_DEFAULT_VALUE);
  }

  public boolean isDocumentsCreatedPerStimmzettelgebiet() {
    return documentsCreatedPerStimmzettelgebiet;
  }

  public boolean isDocumentsCreatedPerGemeinde() {
    return documentsCreatedPerGemeinde;
  }

  public boolean isTabellenCreatedPerDatenArt() {
    return tabellenCreatedPerDatenArt;
  }

  public boolean isTabellenCreatedPseudoGemeindeGesamt() {
    return tabellenCreatedPseudoGemeindeGesamt;
  }

  public int getAnzahlZeilenProSeite() {
    return anzahlZeilenProSeite;
  }

  public boolean hasDokumentVorlageGesamtergebnis() {
    return getDokumentVorlageGesamtergebnis() != null;
  }

  public DokumentVorlage getDokumentVorlageGesamtergebnis() {
    return dokumentVorlageGesamtergebnis;
  }

  public boolean hasDokumentVorlageStimmen() {
    return hasDokumentVorlageErsteSeite() || hasDokumentVorlageWeitereSeiten();
  }

  public boolean hasDokumentVorlageErsteSeite() {
    return hasDokumentVorlageErsteSeiteDirektstimmen() || hasDokumentVorlageErsteSeiteListenstimmen();
  }

  public boolean hasDokumentVorlageErsteSeiteDirektstimmen() {
    return getDokumentVorlageErsteSeiteDirektstimmen() != null;
  }

  public DokumentVorlage getDokumentVorlageErsteSeiteDirektstimmen() {
    return dokumentVorlageErsteSeiteDirektstimmen;
  }

  public boolean hasDokumentVorlageErsteSeiteListenstimmen() {
    return getDokumentVorlageErsteSeiteListenstimmen() != null;
  }

  public DokumentVorlage getDokumentVorlageErsteSeiteListenstimmen() {
    return dokumentVorlageErsteSeiteListenstimmen;
  }

  public int getDokumentVorlageErsteSeiteAnzahlSpalten() {
    return dokumentVorlageErsteSeiteAnzahlSpalten;
  }

  public boolean hasDokumentVorlageWeitereSeiten() {
    return hasDokumentVorlageWeitereSeitenDirektstimmen() || hasDokumentVorlageWeitereSeitenListenstimmen();
  }

  public boolean hasDokumentVorlageWeitereSeitenDirektstimmen() {
    return getDokumentVorlageWeitereSeitenDirektstimmen() != null;
  }

  public DokumentVorlage getDokumentVorlageWeitereSeitenDirektstimmen() {
    return dokumentVorlageWeitereSeitenDirektstimmen;
  }

  public boolean hasDokumentVorlageWeitereSeitenListenstimmen() {
    return getDokumentVorlageWeitereSeitenListenstimmen() != null;
  }

  public DokumentVorlage getDokumentVorlageWeitereSeitenListenstimmen() {
    return dokumentVorlageWeitereSeitenListenstimmen;
  }

  public int getDokumentVorlageWeitereSeitenAnzahlSpalten() {
    return dokumentVorlageWeitereSeitenAnzahlSpalten;
  }
}
