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

import java.io.Serializable;

import javax.inject.Inject;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.wahl.control.WahlterminNummerRelevant;
import de.ivu.elect.business.wahl.entity.WahlartDokumentvorlagen;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminMeta;
import de.ivu.elect.business.wahl.entity.WahlterminProperties;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;


import static java.util.Arrays.asList;

public class WahlterminViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlterminMeta wahlterminMeta;

  @Inject
  private transient WahlterminNummerRelevant wahlterminNummerRelevant;

  @Inject
  private transient WahlOderWahlterminSecurityViewFormBuilder  wahlOderWahlterminSecurityViewFormBuilder;

  @Inject
  private transient CurrentCustomer currentCustomer;

  public WahlterminViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Wahltermin wahltermin) {
    addProperties(formBuilder, wahltermin, false);
  }

  public void addProperties(FormBuilder formBuilder, Wahltermin wahltermin, boolean readonly) {
    addProperties(formBuilder, wahltermin, wahltermin.isWahlhelferdatenbank(), false);
  }

  protected void addProperties(FormBuilder formBuilder, Wahltermin wahltermin, boolean wahlhelferdatenbankSelected, boolean readonly) {
    WahlterminProperties wahlterminProperties = wahltermin.getProperties();

    formBuilder.addProperty(wahlterminProperties.getWahldatumProperty())
        /*ELECTMUC-2011 .withValidatorAndPk(wahlterminUniqueUKFacesValidator, wahltermin.getPk())*/.withReadonly(readonly || wahlhelferdatenbankSelected);

    if (isNummerRelevant()) {
      formBuilder.addProperty(wahlterminProperties
          .getNummerProperty())/*.withReadonly(wahltermin.isPersistent())  Nummer sollte als Teil des UK nicht geändert werden (insbesondere beim WAS und der Replikation relevant) */;
    }

    formBuilder.addProperty(wahlterminProperties.getNameProperty()).withReadonly(readonly || wahlhelferdatenbankSelected).required(); // ELECT-3118
    formBuilder.addProperty(wahlterminProperties.getFarbeProperty()).withType(PropertyType.INPUT_COLOR).withReadonly(readonly);

    if (!wahlhelferdatenbankSelected) {
      addStaatsangehoerigkeit(formBuilder, readonly, wahlterminProperties);

      if (!wahltermin.isStichwahltermin()) {
        formBuilder.addProperty(wahlterminProperties.getStichwahlMoeglichProperty()).withReadonly(readonly);
        formBuilder.addProperty(wahlterminProperties.getStichwahlWahldatumProperty()).withReadonly(readonly);
      }

      wahlOderWahlterminSecurityViewFormBuilder.addSecurityProperties(formBuilder, wahltermin, readonly);

      LambdaEnumProperty<WahlartDokumentvorlagen> dokumentvorlagenProperty = new LambdaEnumProperty<>(
          wahlterminMeta.getDokumentvorlagenEinzahlMessage(), true,
          wahltermin::setDokumentvorlagen,
          wahltermin::getDokumentvorlagen, WahlartDokumentvorlagen.class, asList(WahlartDokumentvorlagen.values()), true);
      dokumentvorlagenProperty.setValueFilter(value -> value.isGeeignetFuer(currentCustomer.getCustomer(), wahltermin.getMandant().getSystemGebietsebene()));
      formBuilder.addProperty(dokumentvorlagenProperty).withReadonly(readonly);
    }
  }

  // ELECTMUC-1374
  protected boolean isNummerRelevant() {
    return wahlterminNummerRelevant.isNummerRelevant();
  }

  protected void addStaatsangehoerigkeit(FormBuilder formBuilder, boolean readonly, WahlterminProperties wahlterminProperties) {
    formBuilder.addProperty(wahlterminProperties.getBuergerZugelassenProperty())
        .withLabel(wahlterminMeta.getBuergerZugelassenMehrzahlMessage()).withReadonly(readonly);
  }
}
