
package de.ivu.elect.presentation.wahlausschuss;

import javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenregister.boundary.PersonenregisterByPersonendatenSearchParameters;
import de.ivu.elect.business.personenregister.boundary.PersonenregisterPersonendatenConversationSelect;
import de.ivu.elect.business.personenregister.control.WahlausschussmitgliedPersonenregisterPersonendatenMapper;
import de.ivu.elect.business.personenregister.entity.PersonenregisterPersonendaten;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlausschuss.form.WahlausschussmitgliedViewFormBuilder;

@RequestScoped
@OnlineHilfeId(value = "396", mehrfachVergebenOk = true)
@Named(AbstractWahlausschussmitgliedCreateNoScopeView.COMPONENT_NAME)
@View(viewId = AbstractWahlausschussmitgliedCreateView.VIEW_ID, useCase = UseCasePermission.WAHLAUSSCHUSSMITGLIED_CREATE)
public class WahlausschussmitgliedCreateView extends AbstractWahlausschussmitgliedCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient PersonenregisterPersonendatenConversationSelect personenregisterPersonendatenSelect;

  @Inject
  private transient WahlausschussmitgliedPersonenregisterPersonendatenMapper wahlausschussmitgliedPersonenregisterPersonendatenMapper;

  @Inject
  private transient WahlausschussmitgliedCreateViewHelper wahlausschussmitgliedCreateViewHelper;

  public WahlausschussmitgliedCreateView() {
    super();
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {
    return wahlausschussmitgliedCreateViewHelper.checkPreCondition();
  }

  private Wahl getWahl() {
    return getSelectedGebiet().getWahl();
  }

  @Override
  @PostConstruct
  public void init() {
    super.init();

    getEntity().setGebiet(getSelectedGebiet());

    tryPresetPersonenregisterPersonendaten();
  }

  @Override
  public Wahlausschussmitglied getEntity() {
    Wahl wahl = getWahl();

    Wahlausschussmitglied entityLokal = super.getEntity();
    entityLokal.setWahltermin(wahl.getWahltermin());
    entityLokal.setWahl(wahl);

    return entityLokal;
  }

  private void tryPresetPersonenregisterPersonendaten() {
    if (isPersonenregisterPersonendatenSelected()) {
      initPersonenregisterPersonendaten(getPersonenregisterPersonendaten());
    } else if (isPersonenregisterByPersonendatenSearchParametersSelected()) {
      initPersonenregisterPersonendaten(getPersonenregisterByPersonendatenSearchParameters());
    }
  }

  private boolean isPersonenregisterPersonendatenSelected() {
    return personenregisterPersonendatenSelect.isPersonenregisterPersonendatenSelected();
  }

  private PersonenregisterPersonendaten getPersonenregisterPersonendaten() {
    return personenregisterPersonendatenSelect.getPersonenregisterPersonendaten();
  }

  private void initPersonenregisterPersonendaten(PersonenregisterPersonendaten personenregisterPersonendaten) {
    Personendaten personendaten = getEntity();

    wahlausschussmitgliedPersonenregisterPersonendatenMapper.mapManuelleAuswahl(personendaten, personenregisterPersonendaten);
    getViewFormBuilder().tryAttachStaatsangehoerigkeiten(personendaten);
  }

  private boolean isPersonenregisterByPersonendatenSearchParametersSelected() {
    return personenregisterPersonendatenSelect.isPersonenregisterByPersonendatenSearchParametersSelected();
  }

  private PersonenregisterByPersonendatenSearchParameters getPersonenregisterByPersonendatenSearchParameters() {
    return personenregisterPersonendatenSelect.getPersonenregisterByPersonendatenSearchParameters();
  }

  private void initPersonenregisterPersonendaten(PersonenregisterByPersonendatenSearchParameters searchParameters) {
    Personendaten personendaten = getEntity();
    personendaten.setFamilienname(searchParameters.getFamilienname());
    personendaten.setRufname(searchParameters.getVorname());
    personendaten.setGeburtsdatum(searchParameters.getGeburtsdatum());
    personendaten.setGeschlecht(searchParameters.getGeschlecht());
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Wahlausschussmitglied entity) {
    getViewFormBuilder().addProperties(formBuilder, entity);
  }

  @Override
  @Redirect
  public String goBack() {
    super.goBack();

    if (personenregisterPersonendatenSelect.isSelected()) {
      personenregisterPersonendatenSelect.clear();
    }

    return getParentViewId();
  }

  protected WahlausschussmitgliedViewFormBuilder getViewFormBuilder() {
    return wahlausschussmitgliedCreateViewHelper.getViewFormBuilder();
  }
}
