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

import javax.faces.validator.LongRangeValidator;
import javax.inject.Inject;

import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.wahl.boundary.WahlkonfigurationAnpassbar;
import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.WahlartProperties;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.PropertyType;
import de.ivu.elect.presentation.ViewFormBuilder;

public class WahlartViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlkonfigurationAnpassbar wahlkonfigurationAnpassbar;

  public WahlartViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Wahlart wahlart) {
    boolean wahlartNichtAnpassbar = !isWahlartAnpassbar(wahlart.getMandant());

    addProperties(formBuilder, wahlart, wahlartNichtAnpassbar);
  }

  protected void addProperties(FormBuilder formBuilder, Wahlart wahlart, boolean wahlartNichtAnpassbar) {
    addDefaultBaseProperties(formBuilder, wahlart, wahlartNichtAnpassbar);
  }

  protected void addDefaultBaseProperties(FormBuilder formBuilder, Wahlart wahlart, boolean wahlartNichtAnpassbar) {
    WahlartProperties wahlartProperties = wahlart.getProperties();

    addNamenProperty(formBuilder, wahlart, wahlartNichtAnpassbar);

    addKennzeichenProperties(formBuilder, wahlart, wahlartNichtAnpassbar);

    formBuilder.addProperty(wahlartProperties.getFarbeProperty()).withType(PropertyType.INPUT_COLOR); // immer anpassbar, hängt keine Semantik dran

    addSystemWahlartProperties(formBuilder, wahlart, wahlartNichtAnpassbar);

    formBuilder.addProperty(wahlartProperties.getAnzahlStimmzettelProperty()).withValidator(new LongRangeValidator(1000L/* willkürlich, vgl. WahlViewFormBuilder */, 0L)); // immer anpassbar, hängt keine Semantik dran
  }

  protected void addNamenProperty(FormBuilder formBuilder, Wahlart wahlart, boolean wahlartNichtAnpassbar) {
    WahlartProperties wahlartProperties = wahlart.getProperties();

    formBuilder.addProperty(wahlartProperties.getNameProperty()).withReadonly(wahlartNichtAnpassbar);
    formBuilder.addProperty(wahlartProperties.getTitelProperty()); // Bezeichnung immer anpassbar
  }

  protected void addKennzeichenProperties(FormBuilder formBuilder, Wahlart wahlart, boolean wahlartNichtAnpassbar) {
    WahlartProperties wahlartProperties = wahlart.getProperties();

    formBuilder.addProperty(wahlartProperties.getKurznameProperty()); // immer anpassbar, hängt keine Semantik dran
    formBuilder.addProperty(wahlartProperties.getKennzeichenProperty()); // immer anpassbar, hängt keine Semantik dran
  }

  protected LambdaEnumProperty<CommonWahlart> addSystemWahlartProperties(FormBuilder formBuilder, Wahlart wahlart, boolean wahlartNichtAnpassbar) {
    WahlartProperties wahlartProperties = wahlart.getProperties();

    LambdaEnumProperty<CommonWahlart> commonWahlartProperty = wahlartProperties.getCommonWahlartProperty();
    formBuilder.addProperty(commonWahlartProperty).withReadonly(wahlartNichtAnpassbar);

    return commonWahlartProperty;
  }

  protected boolean isWahlartAnpassbar(Mandant mandant) {
    return wahlkonfigurationAnpassbar.isWahlkonfigurationAnpassbar(mandant);
  }
}
