
package de.ivu.elect.presentation.personenpruefung;

import java.util.Collection;

import javax.inject.Inject;

import de.ivu.elect.business.person.entity.Beruf;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenProperties;
import de.ivu.elect.business.personenpruefung.control.wertelisten.PersonendatenWertelistenAbgleichMatcher;
import de.ivu.elect.business.personenpruefung.control.wertelisten.PersonendatenWertelistenAbgleichMatcherResolver;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktArt;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.person.form.PersonendatenAkademischerGradAutoCompleteOptionsProvider;
import de.ivu.elect.presentation.person.form.PersonendatenAkademischerGradAutoCompleteProperty;
import de.ivu.elect.presentation.person.form.PersonendatenBerufAutoCompleteOptionsProvider;
import de.ivu.elect.presentation.person.form.PersonendatenBerufAutoCompleteProperty;
import de.ivu.elect.presentation.person.form.PersonendatenEhrenamtAutoCompleteOptionsProvider;
import de.ivu.elect.presentation.person.form.PersonendatenEhrenamtAutoCompleteProperty;

@OnlineHilfeId(value = "478", mehrfachVergebenOk = true)
public abstract class AbstractPersonenKonfliktWertelistenAbgleichAufloesenView extends AbstractPersonenKonfliktAufloesenView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient PersonendatenWertelistenAbgleichMatcherResolver personendatenWertelistenAbgleichMatcherResolver;

  @Inject
  private transient PersonendatenBerufAutoCompleteOptionsProvider personendatenBerufAutoCompleteOptionsProvider;

  @Inject
  private transient PersonendatenEhrenamtAutoCompleteOptionsProvider personendatenEhrenamtAutoCompleteOptionsProvider;

  @Inject
  private transient PersonendatenAkademischerGradAutoCompleteOptionsProvider personendatenAkademischerGradAutoCompleteOptionsProvider;

  private AdvancedDynaFormModel personendatenModel;

  public AbstractPersonenKonfliktWertelistenAbgleichAufloesenView() {
    super();
  }

  @Override
  public PersonenKonfliktArt getExpectedKonfliktArt() {
    return PersonenKonfliktArt.WERTELISTEN_ABGLEICH_FEHLGESCHLAGEN;
  }

  protected PersonendatenWertelistenAbgleichMatcher getMatcher() {
    return personendatenWertelistenAbgleichMatcherResolver.getMatcher(getPersonendaten());
  }

  /*
   * NOTE ELECT-2730, dass der Konflikt nicht als irrelevant akzeptiert werden darf und ungültige Werte korrigiert werden müssen!
   */
  @Override
  public boolean isBtnMarkPersonendatenValidRendered() {
    return false;
  }

  public String getPersonendatenHeader() {
    return konfliktMeta.getPersonendatenEinzahlMessage();
  }

  public AdvancedDynaFormModel getPersonendatenModel() {
    if (personendatenModel == null) {
      personendatenModel = createPersonendatenModel(getPersonendaten());
    }

    return personendatenModel;
  }

  private AdvancedDynaFormModel createPersonendatenModel(Personendaten personendaten) {
    FormBuilder formBuilder = new FormBuilder();

    addVerifiedPersonendatenProperties(formBuilder, personendaten);

    PersonendatenProperties properties = personendaten.getProperties();

    formBuilder.addProperty(properties.getPersonStatusProperty());
    formBuilder.globalReadonly();

    return formBuilder.createModel();
  }

  protected void addVerifiedPersonendatenProperties(FormBuilder formBuilder, Personendaten personendaten) {
    PersonendatenProperties properties = personendaten.getProperties();

    formBuilder.addProperty(properties.getFamiliennameProperty());
    formBuilder.addProperty(properties.getRufnameProperty());
    formBuilder.addProperty(properties.getVornamenProperty());

    formBuilder.addProperty(properties.getGeburtsdatumProperty());

    formBuilder.addProperty(new PersonendatenBerufAutoCompleteProperty(personendaten, personendatenBerufAutoCompleteOptionsProvider));
    if (hasUnmatchedBerufe(personendaten)) {
      formBuilder.withWarningMessage(getVerificationInvalidValueDetailsMessage());
    }

    formBuilder.addProperty(new PersonendatenAkademischerGradAutoCompleteProperty(personendaten, personendatenAkademischerGradAutoCompleteOptionsProvider));
    if (hasUnmatchedAkademischerGrad(personendaten)) {
      formBuilder.withWarningMessage(getVerificationInvalidValueDetailsMessage());
    }

    formBuilder.addProperty(new PersonendatenEhrenamtAutoCompleteProperty(personendaten, personendatenEhrenamtAutoCompleteOptionsProvider));
    if (hasUnmatchedEhrenamt(personendaten)) {
      formBuilder.withWarningMessage(getVerificationInvalidValueDetailsMessage());
    }
  }

  protected boolean hasUnmatchedBerufe(Personendaten personendaten) {
    return !getMatcher().matchesBeruf(getBerufe(), personendaten);
  }

  protected Collection<Beruf> getBerufe() {
    if (!personendatenBerufAutoCompleteOptionsProvider.isInitialized()) {
      personendatenBerufAutoCompleteOptionsProvider.setPersonendaten(getPersonendaten());
    }

    return personendatenBerufAutoCompleteOptionsProvider.getBerufe();
  }

  protected boolean hasUnmatchedAkademischerGrad(Personendaten personendaten) {
    return !getMatcher().matchesAkademischerGrad(getAkademischeGrade(), personendaten);
  }

  protected Collection<Wertelisten> getAkademischeGrade() {
    if (!personendatenAkademischerGradAutoCompleteOptionsProvider.isInitialized()) {
      personendatenAkademischerGradAutoCompleteOptionsProvider.setPersonendaten(getPersonendaten());
    }

    return personendatenAkademischerGradAutoCompleteOptionsProvider.getAkademischeGrade();
  }

  protected boolean hasUnmatchedEhrenamt(Personendaten personendaten) {
    return !getMatcher().matchesEhrenamt(getEhrenaemter(), personendaten);
  }

  protected Collection<Wertelisten> getEhrenaemter() {
    if (!personendatenEhrenamtAutoCompleteOptionsProvider.isInitialized()) {
      personendatenEhrenamtAutoCompleteOptionsProvider.setPersonendaten(getPersonendaten());
    }

    return personendatenEhrenamtAutoCompleteOptionsProvider.getEhrenaemter();
  }

  protected String getVerificationInvalidValueDetailsMessage() {
    return getMessage("personen.konflikt.wertelisten.abgleich.INVALID_VALUE_detail");
  }
}
