
package de.ivu.elect.dokumente.wahltermin;

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

import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.document.generator.template.annotations.DocumentSimpleField;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.dokumente.BaseElectContext;
import de.ivu.elect.dokumente.ElectDocument;

public abstract class AbstractWahlOderWahlterminDokument extends ElectDocument {

  private static final long serialVersionUID = 1L;

  @DocumentSimpleField("Ist-Aktuell-Ausgewaehlt")
  public final boolean aktuellAusgewaehlt;

  @DocumentRepeat(value = "Gebiete", elementClass = WahlterminGebietDokument.class, itemName = "gebiet")
  public final List<WahlterminGebietDokument> gebiete;

  @DocumentRepeat(value = "Urnenwahlbezirke", elementClass = WahlterminGebietDokument.class, itemName = "urnenwahlbezirk")
  public final List<WahlterminGebietDokument> urnenwahlbezirke;

  @DocumentRepeat(value = "Briefwahlbezirke", elementClass = WahlterminGebietDokument.class, itemName = "briefwahlbezirk")
  public final List<WahlterminGebietDokument> briefwahlbezirke;

  // ELECT-8835
  @DocumentRepeat(value = "Sonderstimmbezirke", elementClass = WahlterminGebietDokument.class, itemName = "sonderstimmbezirk")
  public final List<WahlterminGebietDokument> sonderstimmbezirke;

  protected AbstractWahlOderWahlterminDokument(BaseElectContext baseElectContext, boolean aktuellAusgewaehlt, List<Gebiet> gebieteInWahlOderWahltermin,
      Map<Gebiet, WahlterminGebietDokument> wahlterminGebietDokumentPerGebiet) {
    super(baseElectContext);

    this.aktuellAusgewaehlt = aktuellAusgewaehlt;

    this.gebiete = new ArrayList<>();

    this.urnenwahlbezirke = new ArrayList<>();
    this.briefwahlbezirke = new ArrayList<>();
    this.sonderstimmbezirke = new ArrayList<>();

    for (Gebiet gebiet : gebieteInWahlOderWahltermin) {
      WahlterminGebietDokument gebietDokument = wahlterminGebietDokumentPerGebiet.get(gebiet);

      this.gebiete.add(gebietDokument);

      if (Boolean.TRUE.equals(gebiet.getSonderstimmbezirk())) {
        this.sonderstimmbezirke.add(gebietDokument);
      } else {
        if (gebiet.isUrnenwahlgebiet()) {
          this.urnenwahlbezirke.add(gebietDokument);
        }

        if (gebiet.isBriefwahlgebiet()) {
          this.briefwahlbezirke.add(gebietDokument);
        }
      }
    }
  }
}
