
package de.ivu.elect.presentation.gebietsbaum.form;

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.anschrift.entity.NlZipCodeProperty;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietProperties;
import de.ivu.elect.business.gebietsbaum.entity.GebietsartBezirksart;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;

/**
 * NOTE: NL-ViewFormBuilder sind unabhängig vom Produkt. (ELECT-9733)
 */
@Specializes
public class NlWasGebietViewFormBuilder extends WasGebietViewFormBuilder {

  private static final long serialVersionUID = 1L;

  public NlWasGebietViewFormBuilder() {
    super();
  }

  @Override
  public void addGebietProperties(FormBuilder formBuilder, Gebiet gebiet) {
    addGebietProperties(formBuilder, gebiet, false);
  }

  @Override
  public void addGebietProperties(FormBuilder formBuilder, Gebiet gebiet, boolean readonly) {
    GebietProperties gebietProperties = gebiet.getProperties();

    addGebietsartProperty(formBuilder, gebiet, readonly);

    formBuilder.addProperty(gebietProperties.getNummerProperty()) //
        .withTooltip(getMessageByGebietsart(gebiet, "gebiet.edit.nummer.tooltip")) //
        .withValidator(new NlGebietsnummerValidator()) // ELECT-11419
        .withReadonly(readonly);

    if (gebiet.hasUebergeordnetesGebiet()) {
      formBuilder.addProperty(new ReadOnlyStringProperty(gebietMeta.getUebergeordnetesGebietEinzahlMessage(), gebietNummerFormatter.getNameMitNummer(gebiet.getUebergeordnetesGebiet())));
    }

    formBuilder.addProperty(gebietProperties.getNameProperty()).withRequired(true /* ELECT-9906 */).withReadonly(readonly).visibleOnPageLoad();

    GebietsartBezirksart gebietsartBezirksart = gebiet.getGebietsart().getBezirksart();

    if (gebietsartBezirksart.isBezirk()) {
      formBuilder.addProperty(gebietProperties.getPositionProperty()).withReadonly(readonly).visibleOnPageLoad(); // ELECT-11463 Position bei Bezirken anzeigen, um diese sortieren zu können...
    }

    addSitzeStimmenProperties(formBuilder, gebiet, readonly);

    if (gebiet.isErfassungsgebiet()) {
      if (gebietsartBezirksart.isBezirk()) { // ELECT-10458
        formBuilder.addProperty(new NlZipCodeProperty(gebiet.getAnschrift().getProperties().getPlzProperty())).withReadonly(readonly).visibleOnPageLoad(); // ELECT-9685

        // ELECT-10458
        addAnzahlWahlberechtigteProperties(formBuilder, gebiet, readonly);
      }

      if (gebietsartBezirksart.isStimmbezirk()) { // ELECT-11700
        formBuilder.addProperty(gebietProperties.getAuswahlbezirkProperty()).withReadonly(readonly).visibleOnPageLoad();
      }
    }

    if (isNotBlank(gebiet.getExterneId())) { // ELECT-10440
      formBuilder.addProperty(gebiet.getProperties().getExterneIdProperty()).withReadonly(true);
    }
  }

  @Override
  protected void addGebietsartProperty(FormBuilder formBuilder, Gebiet gebiet, boolean readonly) {
    super.addGebietsartProperty(formBuilder, gebiet, readonly);

    boolean briefwahlbezirkSelected = gebiet.isPersistent() && gebiet.getGebietsart().getBezirksart().isBriefwahlbezirk();

    if (briefwahlbezirkSelected && NlWahlart.isBriefwahlAuslandUnterstuetzt(gebiet) && (NlWahlart.isBriefwahlGemeindeUnterstuetzt(gebiet) || !new NlGebiet(gebiet).isBriefwahlgebietAusland())) { // ELECT-11569, "normale" Briefwahlbezirke sollen nach dem Import als "Briefwahlbezirke (Ausland)" markiert werden können...
      formBuilder.addProperty(gebiet.getProperties().getSonderstimmbezirkProperty()).withReadonly(readonly).visibleOnPageLoad();
    }
  }

  /*
   * NOTE: In NL wird nur die Anzahl "Wahlberechtigter Gesamt" gespeichert. Wir verwenden dafür am Gebiet "Wahlberechtigte ohne Wahlschein". (ELECT-9685)
   */
  private void addAnzahlWahlberechtigteProperties(FormBuilder formBuilder, Gebiet gebiet, boolean readonly) {
    Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = asWahldurchfuehrungsgebiet(gebiet);

    boolean anzahlWahlberechtigteGesamtSummandenReadonly = readonly || isAnzahlWahlberechtigteGesamtSummandenReadonly(wahldurchfuehrungsgebiet);
    boolean anzahlWahlberechtigeOhneWahlscheinReadOnly = anzahlWahlberechtigteErfassungState.isAnzahlWahlberechtigeOhneWahlscheinReadOnly(wahldurchfuehrungsgebiet);

    formBuilder.addProperty(wahldurchfuehrungsgebiet.getProperties().getAnzahlWahlberechtigteOhneWahlscheinProperty()) //
        .withLabel(kopfzahlLabelGenerator.getAnzahlWahlberechtigteGesamtBezeichnung(wahldurchfuehrungsgebiet)) //
        .withReadonly(anzahlWahlberechtigteGesamtSummandenReadonly || anzahlWahlberechtigeOhneWahlscheinReadOnly) //
        .visibleOnPageLoad();
  }

  @Override
  protected boolean isAnzahlWahlberechtigteGesamtSummandenReadonly(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    // wie bisher
    return anzahlWahlberechtigteErfassungState.isErfassungGesperrt(wahldurchfuehrungsgebiet);
  }
}
