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

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.WahlvorschlagStimmzettelPositionVorgegebenProperty;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahlvorschlag.entity.PrivilegierungsTyp;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagProperties;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractStringProperty;
import de.ivu.elect.jee.presentation.dynamicform.AbstractTimestampProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.TimestampDateProperty;
import de.ivu.elect.jee.presentation.dynamicform.TimestampTimeProperty;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.wahlvorschlag.AutoUpdateWahlvorschlagKennwortProperty;
import de.ivu.elect.presentation.wahlvorschlag.AutoUpdateWahlvorschlagKurznameProperty;
import de.ivu.elect.presentation.wahlvorschlag.AutoUpdateWahlvorschlagPrivilegierungsTypProperty;
import de.ivu.elect.presentation.wahlvorschlag.AutoUpdateWahlvorschlagZusatzbezeichnungProperty;
import de.ivu.elect.presentation.wahlvorschlag.WahlvorschlagGruppeFinder;

public class WahlvorschlagViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  private transient WahlvorschlagGruppeFinder wahlvorschlagGruppeFinder;

  public WahlvorschlagViewFormBuilder() {
    super();
  }

  protected boolean hasSupportedPolitischeGruppen(Wahlvorschlag wahlvorschlag, Gebiet gebiet) {
    return !wahlvorschlagGruppeFinder.findSupportedPolitischeGruppen(gebiet, wahlvorschlag).isEmpty();
  }

  protected void addGruppeProperties(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    formBuilder.addProperty(gruppeFinderProperty).withReadonly(wahlvorschlag.isPersistent()); // ELECT-177

    if (wahlvorschlag.getGruppeImGebiet() != null) {
      formBuilder.addProperty(new WahlvorschlagStimmzettelPositionVorgegebenProperty(wahlvorschlag)).visibleOnPageLoad(); // ELECTKOM-898
    }
  }

  public void addNamenProperties(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    // ELECT-2542
    addKennwortProperty(formBuilder, wahlvorschlag, gruppeFinderProperty);
    addKurznameProperty(formBuilder, wahlvorschlag, gruppeFinderProperty);
    addZusatzbezeichnungProperty(formBuilder, wahlvorschlag, gruppeFinderProperty);
  }

  private void addZusatzbezeichnungProperty(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    AbstractStringProperty zusatzbezeichnungProperty = createZusatzbezeichnungProperty(wahlvorschlag);

    if (gruppeFinderProperty != null) {
      formBuilder.addProperty(new AutoUpdateWahlvorschlagZusatzbezeichnungProperty(zusatzbezeichnungProperty, gruppeFinderProperty)).withObservedProperty(gruppeFinderProperty);
    } else {
      formBuilder.addProperty(zusatzbezeichnungProperty);
    }

    formBuilder.visibleOnPageLoad();
  }

  protected void addEinreichungProperties(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    addZeitpunktDerEinreichungProperty(formBuilder, wahlvorschlag);
    addPrivilegierungsTypProperty(formBuilder, wahlvorschlag, gruppeFinderProperty);
    addUnterstuetzerProperties(formBuilder, wahlvorschlag);
  }

  private void addKennwortProperty(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    AbstractStringProperty kennwortProperty = createKennwortProperty(wahlvorschlag);

    if (gruppeFinderProperty != null) {
      formBuilder.addProperty(new AutoUpdateWahlvorschlagKennwortProperty(kennwortProperty, gruppeFinderProperty)).withObservedProperty(gruppeFinderProperty);
    } else {
      formBuilder.addProperty(kennwortProperty);
    }

    formBuilder.required();
  }

  private void addKurznameProperty(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    AbstractStringProperty kurznameProperty = createKurznameProperty(wahlvorschlag);

    if (gruppeFinderProperty != null) {
      formBuilder.addProperty(new AutoUpdateWahlvorschlagKurznameProperty(kurznameProperty, gruppeFinderProperty)).withObservedProperty(gruppeFinderProperty);
    } else {
      formBuilder.addProperty(kurznameProperty);
    }

    formBuilder.visibleOnPageLoad();
  }

  protected void addZeitpunktDerEinreichungProperty(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag) {
    AbstractTimestampProperty zeitpunktDerEinreichungProperty = wahlvorschlag.getProperties().getZeitpunktDerEinreichungProperty();

    formBuilder.addProperty(new TimestampDateProperty(zeitpunktDerEinreichungProperty));
    formBuilder.addProperty(new TimestampTimeProperty(zeitpunktDerEinreichungProperty));
  }

  private void addPrivilegierungsTypProperty(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag, WahlvorschlagGruppeFinderProperty gruppeFinderProperty) {
    if (isZulassungspruefungAktiv()) {
      AbstractEnumProperty<PrivilegierungsTyp> privilegierungsTypProperty = wahlvorschlag.getProperties().getPrivilegierungsTypProperty();

      if (gruppeFinderProperty != null) {
        formBuilder.addProperty(new AutoUpdateWahlvorschlagPrivilegierungsTypProperty(privilegierungsTypProperty, gruppeFinderProperty)).withObservedProperty(gruppeFinderProperty);
      } else {
        formBuilder.addProperty(privilegierungsTypProperty);
      }
    }
  }

  private void addUnterstuetzerProperties(FormBuilder formBuilder, Wahlvorschlag wahlvorschlag) {
    WahlvorschlagProperties wahlvorschlagProperties = wahlvorschlag.getProperties();

    if (isUnterstuetzerInternErfassbar()) {
      formBuilder.addProperty(wahlvorschlagProperties.getUnterstuetzerErfassbarAbProperty());
    }

    if (isZulassungspruefungAktiv()) {
      formBuilder.addProperty(wahlvorschlagProperties.getAnzahlUnterstuetzerGeeignetErfasstExternProperty());
      formBuilder.addProperty(wahlvorschlagProperties.getAnzahlUnterstuetzerNichtGeeignetErfasstExternProperty());
    }
  }

  protected void addSeparator(FormBuilder formBuilder, String msgKey, Object... params) {
    formBuilder.addSeparator(msgKey, params);
  }

  protected WahlvorschlagGruppeFinderProperty createGruppeFinderProperty(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlagGruppeFinder.getGruppeProperty(wahlvorschlag);
  }

  protected AbstractStringProperty createKennwortProperty(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag.getProperties().getKennwortProperty();
  }

  protected AbstractStringProperty createKurznameProperty(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag.getProperties().getKurznameProperty();
  }

  protected AbstractStringProperty createZusatzbezeichnungProperty(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag.getProperties().getZusatzbezeichnungProperty();
  }

  private boolean isUnterstuetzerInternErfassbar() {
    return wahlSessionSelect.isSelected() && Boolean.TRUE.equals(wahlSessionSelect.getEntity().getUnterstuetzerErfassbar());
  }

  public boolean isZulassungspruefungAktiv() {
    return wahlSessionSelect.isSelected() && wahlSessionSelect.getEntity().getWahlart().getZulassungspruefung().isAktiviert(); // ELECT-9035
  }
}
