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

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.wahl.entity.NlWahlCustomData;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.business.wahl.entity.WahldurchfuehrungConstants;
import de.ivu.elect.jee.presentation.dynamicform.AbstractDateProperty;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaBooleanProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;

@Specializes
public class NlWasWahlViewFormBuilder extends WasWahlViewFormBuilder {

  private static final long serialVersionUID = 1L;

  public NlWasWahlViewFormBuilder() {
    super();
  }

  /**
   * NOTE: NL-ViewFormBuilder sind unabhängig vom Produkt. (ELECT-9733)
   */
  @Override
  protected void addProperties(FormBuilder formBuilder, Wahl wahl, Property wahlartProperty, AbstractDateProperty wahlterminWahldatumProperty, boolean readonly) {
    // hierhin verschoben: ELECT-10265
    //    // TODO ELECT-10265  (ELECT-10252 erstmal hier)
    //    LambdaEnumProperty<NlWahlPhase> wahlPhaseProperty = new LambdaEnumProperty<>(getMessage("entity.einzahl.WAHL.WAHL_PHASE"), true,
    //        w -> wahl.getCustomData(NlWahlCustomData.class).setNlWahlPhase(w), () -> wahl.getCustomData(NlWahlCustomData.class).getNlWahlPhase(), NlWahlPhase.class,
    //        Arrays.asList(NlWahlPhase.values()));
    //    wahlPhaseProperty.setValueFilter(wp->wp.isAccept(currentCustomer.getCustomer(), wahl));
    //    formBuilder.addProperty(wahlPhaseProperty);

    // TODO ELECT-9733 Name des Wahlgebiets

    formBuilder.addProperty(wahl.getProperties().getNameProperty()).withReadonly(true).required();

    formBuilder.addProperty(wahl.getProperties().getKennzeichenProperty()).withReadonly(true).required();

    formBuilder.addProperty(new AutoUpdateFarbeProperty(wahl)).withObservedProperty(wahlartProperty).withReadonly(/* ELECTVAPP-113 */ false);

    if (/*ELECTVAPP-833*/ NlWahlart.isWasCSB(wahl, getCustomer())) {
      // ELECTVAPP-771
      formBuilder.addProperty(new AutoUpdateQuorumProperty(wahl)).withObservedProperty(wahlartProperty).withReadonly(true).required();

      formBuilder.addProperty(new ReadOnlyStringProperty(getMessage(WahldurchfuehrungConstants.MESSAGE_KEY_SITZBERECHNUNGSALGORITHMUS_EINZAHL),
          getMessage(wahl.castTo(Wahldurchfuehrung.class).getEntity().getSitzberechnungsalgorithmus())));
    }

    // ELECT-9953
    if (NlWahlart.isWasGSB(wahl, getCustomer()) && /* ELECTVAPP-2324 */ !(NlWahlart.isNBSB(wahl) || NlWahlart.isNBSBC(wahl))) {
      NlWahlCustomData customData = wahl.getCustomData(NlWahlCustomData.class);

      formBuilder.addProperty(new LambdaBooleanProperty(getMessage("entity.einzahl.WAHL.ZENTRALE_ERFASSUNG"), false, customData::setZentraleErfassung, customData::isZentraleErfassung));
    }

    addSitzeStimmenProperties(formBuilder, wahl, true);
  }

  @Override
  protected void addSitzeStimmenProperties(FormBuilder formBuilder, Wahl wahl, boolean readonly) {
    if (/*ELECTVAPP-771*/ NlWahlart.isWasCSB(wahl, getCustomer())) {
      super.addSitzeStimmenProperties(formBuilder, wahl, readonly);
    }
  }

  private Customer getCustomer() {
    return getCurrentCustomer().getCustomer();
  }

  @Override
  protected String getNameWahlart(Wahlart wahlart) {
    return wahlart.getNameGui(); // ELECTVAPP-219
  }
}
