
package de.ivu.elect.dokumente.wahlausschuss;

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

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.DocumentSimpleField;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.ElectDocument;

@Document(value = DokumentVorlageArt.WAHLAUSSCHUSS_SUB_TEMPLATE, isSubTemplate = true)
public class WahlausschussDokument extends ElectDocument {

  private static final long serialVersionUID = 1L;

  @DocumentRepeat(value = "Wahlausschussmitglieder", elementClass = WahlausschussmitgliedDokument.class, itemName = "wahlausschussmitglied")
  public final List<WahlausschussmitgliedDokument> wahlausschussmitglieder;

  @DocumentSimpleField("IstWahlausschussVorhanden")
  public final boolean wahlausschussVorhanden;

  public WahlausschussDokument(CoreElectContext coreElectContext, @Nullable Gebiet gebiet, Map<Gebiet, Collection<Wahlausschussmitglied>> wahlausschussmitgliederPerGebiet) {
    super(coreElectContext);

    this.wahlausschussmitglieder = erzeugeWahlausschussmitglieder(coreElectContext, gebiet, wahlausschussmitgliederPerGebiet);
    this.wahlausschussVorhanden = !wahlausschussmitglieder.isEmpty();
  }

  private List<WahlausschussmitgliedDokument> erzeugeWahlausschussmitglieder(CoreElectContext coreElectContext, @Nullable Gebiet gebiet,
      Map<Gebiet, Collection<Wahlausschussmitglied>> wahlausschussmitgliederPerGebiet) {
    List<WahlausschussmitgliedDokument> result = new ArrayList<>();

    Long laufendeNummer = 0L;

    for (Wahlausschussmitglied wahlausschussmitgliederEntity : findeWahlausschuss(gebiet, wahlausschussmitgliederPerGebiet)) {
      laufendeNummer++;

      result.add(new WahlausschussmitgliedDokument(coreElectContext, wahlausschussmitgliederEntity, laufendeNummer));
    }

    return result;
  }

  private Collection<Wahlausschussmitglied> findeWahlausschuss(@Nullable Gebiet gebiet, Map<Gebiet, Collection<Wahlausschussmitglied>> wahlausschussmitgliederPerGebiet) {
    if (gebiet == null) {
      return new ArrayList<>();
    }

    Collection<Wahlausschussmitglied> result = wahlausschussmitgliederPerGebiet.get(gebiet);

    if (result == null) {
      return findeWahlausschuss(gebiet.getUebergeordnetesGebiet(), wahlausschussmitgliederPerGebiet);
    }

    return result;
  }
}
