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

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftProperties;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenProperties;
import de.ivu.elect.business.personenpruefung.control.mehrstaatigkeit.AbstractPersonendatenMehrstaatigkeitMatcher;
import de.ivu.elect.business.personenpruefung.control.mehrstaatigkeit.MehrstaatigkeitZulaessigkeit;
import de.ivu.elect.business.personenpruefung.control.mehrstaatigkeit.kriterium.MehrstaatigkeitZulaessigkeitKriterium;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamicform.AdvancedDynaFormModel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.person.form.StaatsangehoerigkeitProperty;

public class PersonenKonfliktMehrstaatigkeitAufloesenViewFormBuilder implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  public PersonenKonfliktMehrstaatigkeitAufloesenViewFormBuilder() {
    super();
  }

  public void addVerifiedPersonendatenProperties(AbstractPersonendatenMehrstaatigkeitMatcher matcher, FormBuilder formBuilder, Personendaten personendaten) {
    addVerifiedPersonendatenProperties(matcher, true, formBuilder, personendaten);
  }

  protected void addVerifiedPersonendatenProperties(AbstractPersonendatenMehrstaatigkeitMatcher matcher, boolean matcherEnabled, FormBuilder formBuilder, Personendaten personendaten) {
    PersonendatenProperties personendatenProperties = personendaten.getProperties();

    formBuilder.addProperty(personendatenProperties.getFamiliennameProperty()).readonly();
    formBuilder.addProperty(personendatenProperties.getRufnameProperty()).readonly();
    formBuilder.addProperty(personendatenProperties.getVornamenProperty()).readonly();

    formBuilder.addProperty(personendatenProperties.getGeburtsdatumProperty()).readonly();

    boolean mehrstaatigkeitZulaessigkeitVerificationFailed = matcherEnabled && !matcher.matchesMehrstaatigkeitZulaessigkeit(personendaten);

    List<Staat> staatsangehoerigkeitenSorted = personendaten.getStaatsangehoerigkeitenSorted();

    for (int i = 0; i < staatsangehoerigkeitenSorted.size(); i++) {
      formBuilder.addProperty(new StaatsangehoerigkeitProperty(i, personendaten, staatsangehoerigkeitenSorted.get(i)));

      if (i == 0 && mehrstaatigkeitZulaessigkeitVerificationFailed) {
        addVerificationFailedDetailsMessage(formBuilder, matcher.collectMehrstaatigkeitZulaessigkeitKriterium(personendaten));
      }
    }

    formBuilder.addProperty(personendatenProperties.getPersonStatusProperty()).readonly();

    addVerifiedAnschriftProperties(matcher, matcherEnabled, formBuilder, personendaten);
  }

  protected void addVerifiedAnschriftProperties(AbstractPersonendatenMehrstaatigkeitMatcher matcher, boolean matcherEnabled, FormBuilder formBuilder, Personendaten personendaten) {
    Anschrift anschrift = personendaten.getAnschrift();
    AnschriftProperties anschriftProperties = anschrift.getProperties();

    formBuilder.addProperty(anschriftProperties.getAnschriftArtProperty()).readonly();

    formBuilder.addProperty(anschriftProperties.getStrasseProperty()).readonly();
    formBuilder.addProperty(anschriftProperties.getHausnummerProperty()).readonly();
    formBuilder.addProperty(anschriftProperties.getHausnummerzusatzProperty()).readonly();
    formBuilder.addProperty(anschriftProperties.getWohnungsnummerProperty()).readonly();

    formBuilder.addProperty(anschriftProperties.getPlzProperty()).readonly();
    formBuilder.addProperty(anschriftProperties.getOrtProperty()).readonly();
    formBuilder.addProperty(anschriftProperties.getOrtsteilProperty()).readonly();

    formBuilder.addProperty(anschriftProperties.getZustellanweisungProperty()).readonly();
  }

  public AdvancedDynaFormModel addPruefSchrittErgebnisProperties(AbstractPersonendatenMehrstaatigkeitMatcher matcher, FormBuilder formBuilder, Personendaten personendaten) {
    PersonenMehrstaatigkeitPruefSchrittErgebnisProperties properties = new PersonenMehrstaatigkeitPruefSchrittErgebnisProperties(matcher, personendaten);

    MehrstaatigkeitZulaessigkeit mehrstaatigkeitZulaessigkeit = matcher.collectMehrstaatigkeitZulaessigkeitKriterium(personendaten).getMehrstaatigkeitZulaessigkeit();

    if (!mehrstaatigkeitZulaessigkeit.isIrrelevant()) {
      formBuilder.addProperty(properties.getMehrstaatigkeitZulaessigkeitProperty(mehrstaatigkeitZulaessigkeit));
    }

    return formBuilder.createModel();
  }

  private void addVerificationFailedDetailsMessage(FormBuilder formBuilder, MehrstaatigkeitZulaessigkeitKriterium kriterium) {
    formBuilder.withWarningMessage(getMessages().lokalisiere(kriterium.getMehrstaatigkeitZulaessigkeit()));
  }

  private Messages getMessages() {
    return messages;
  }
}
