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

import static java.util.Arrays.asList;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.entity.Gewaehlt;
import de.ivu.elect.business.kandidatur.entity.Ersatzkandidatur;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.KandidaturConstants;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.NlListenkandidatur;
import de.ivu.elect.business.kandidatur.entity.NlListenkandidaturProperties;
import de.ivu.elect.business.person.entity.NlGeburtsdatumProperty;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenProperties.GeschlechtProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.SeparatorPseudoProperty;
import de.ivu.elect.presentation.person.form.NlPersonendatenViewFormBuilder;

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

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlPersonendatenViewFormBuilder nlPersonendatenViewFormBuilder;

  public NlListenkandidaturViewFormBuilder() {
    super();
  }

  @Override
  public void addListenkandidaturProperties(FormBuilder formBuilder, Listenkandidatur listenkandidatur, boolean readonly) {
    NlListenkandidatur nlListenkandidatur = new NlListenkandidatur(listenkandidatur);
    NlListenkandidaturProperties nlListenkandidaturProperties = nlListenkandidatur.getProperties();

    // TODO ELECT-10334  formBuilder.addProperty(nlListenkandidaturProperties.getEingereichtePositionProperty()).withReadonly(readonly).visibleOnPageLoad();
    //    if (nlListenkandidatur.isPersistent()) {
    //      formBuilder.addProperty(nlListenkandidaturProperties.getVorgegebenePositionProperty()).withReadonly(readonly);
    //    }
  }

  @Override
  public void addKandidaturProperties(FormBuilder formBuilder, Listenkandidatur listenkandidatur2, boolean readonly) {
    formBuilder.addSeparator(KandidaturConstants.MESSAGE_KEY_ENTITY_EINZAHL); // ELECTVAPP-1426

    NlListenkandidatur nlListenkandidatur = new NlListenkandidatur(listenkandidatur2);
    Personendaten listenkandidaturPersonendaten = nlListenkandidatur.getPersonendaten();

    if (listenkandidaturPersonendaten.getPersonenVerknuepfungen().stream().anyMatch(personenVerknuepfung -> personenVerknuepfung.getPersonen().stream()
        .anyMatch(personendaten -> !listenkandidaturPersonendaten.equals(personendaten) && personendaten.isInstanceOf(Ersatzkandidatur.class)))) {
      formBuilder.addProperty(new SeparatorPseudoProperty("listenkandidatur.verknuepfung.hinweis")).withStyleClass("dyna-form-separator-hinweistext");
    }

    addListenkandidaturPersonendatenProperties(formBuilder, readonly, nlListenkandidatur);

    setzeZusaetzlichePflichtfelderFuerListenkandidaturen(formBuilder);

    Personendaten bevollmaechtigter = getBevollmaechtigten(nlListenkandidatur);

    if (bevollmaechtigter != null) {
      formBuilder.addSeparator("listenkandidatur.ersatzkandidatur.separator");

      if (bevollmaechtigter.getPersonenVerknuepfungen().stream().anyMatch(personenVerknuepfung -> personenVerknuepfung.getPersonen().stream()
          .anyMatch(personendaten -> !bevollmaechtigter.equals(personendaten) && personendaten.isInstanceOf(Listenkandidatur.class)))) {
        formBuilder.addProperty(new SeparatorPseudoProperty("listenkandidatur.ersatzkandidatur.verknuepfung.hinweis")).withStyleClass("dyna-form-separator-hinweistext");
      }

      nlPersonendatenViewFormBuilder.addPersonendatenProperties(formBuilder, bevollmaechtigter, readonly, false);
    }
  }

  protected Personendaten getBevollmaechtigten(NlListenkandidatur nlListenkandidatur) {
    return nlListenkandidatur.getBevollmaechtigter();
  }

  protected void addListenkandidaturPersonendatenProperties(FormBuilder formBuilder, boolean readonly, NlListenkandidatur nlListenkandidatur) {
    nlPersonendatenViewFormBuilder.addPersonendatenProperties(formBuilder, nlListenkandidatur, readonly, true /*ELECTVAPP-1886*/);
  }

  private void setzeZusaetzlichePflichtfelderFuerListenkandidaturen(FormBuilder formBuilder) {
    setPropertiesRequired(formBuilder, asList( //
        NlGeburtsdatumProperty.class, //
        GeschlechtProperty.class //
    ));
  }

  @Override
  public void addGewaehltVorperiodeProperties(FormBuilder formBuilder, Kandidatur kandidatur, Gewaehlt gewaehlt, boolean readonly) {
    // Keine Properties für NL...
  }
}
