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

import java.util.Arrays;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.wahl.entity.*;
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.LambdaEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyStringProperty;

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

@Specializes
public class NlWasWahlViewFormBuilder extends WasWahlViewFormBuilder {

  private static final long serialVersionUID = 1L;


  @Inject
  private transient CurrentCustomer currentCustomer;
  /**
   * 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(false/*ELECTVAPP-113*/);



    if (/*ELECTVAPP-833*/NlWahlart.isWasCSB(wahl, currentCustomer.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.isWasPSB(wahl, currentCustomer.getCustomer())) {
      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, currentCustomer.getCustomer())) {
      super.addSitzeStimmenProperties(formBuilder, wahl, readonly);
    }
  }

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

}
