
package de.ivu.elect.dokumente.gebiet;

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

import javax.annotation.Nullable;

import de.ivu.document.generator.template.annotations.Document;
import de.ivu.document.generator.template.annotations.DocumentRepeat;
import de.ivu.document.generator.template.annotations.DocumentSubTemplate;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.dokumente.BaseElectContext;

// ELECT-2957
@Document(value = DokumentVorlageArt.GEBIET_MIT_HIERARCHIE_SUB_TEMPLATE, isSubTemplate = true)
public class GebietMitHierarchieDokument extends GebietMitAnsprechpartnerDokument {

  public static final GebietMitHierarchieDokument EMPTY_OBJECT = new GebietMitHierarchieDokument();

  private static final long serialVersionUID = 1L;

  @DocumentSubTemplate
  @DocumentRepeat(value = "ÜbergeordneteGebiete", elementClass = GebietMitAnsprechpartnerDokument.class, itemName = "uebergeordnetesGebiet")
  public final List<GebietMitAnsprechpartnerDokument> uebergeordneteGebiete;

  protected GebietMitHierarchieDokument() {
    super();

    this.uebergeordneteGebiete = new ArrayList<>();
  }

  public GebietMitHierarchieDokument(BaseElectContext baseElectContext, Gebiet gebiet) {
    super(baseElectContext, gebiet);

    this.uebergeordneteGebiete = bestimmeUebergeordneteGebiete(baseElectContext, gebiet.getUebergeordnetesGebiet());
  }

  private List<GebietMitAnsprechpartnerDokument> bestimmeUebergeordneteGebiete(BaseElectContext baseElectContext, @Nullable Gebiet gebiet) {
    List<GebietMitAnsprechpartnerDokument> result = new ArrayList<>();

    if (gebiet == null) {
      return result;
    }

    // !! NICHT "this" hinzufügen, sonst baust du eine Endlosschleife !!
    result.add(new GebietMitAnsprechpartnerDokument(baseElectContext, gebiet));
    result.addAll(bestimmeUebergeordneteGebiete(baseElectContext, gebiet.getUebergeordnetesGebiet()));

    return result;
  }
}
