
package de.ivu.elect.business.person.entity;

import static java.util.Arrays.asList;
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;

import java.text.DateFormat;
import java.util.Date;
import java.util.List;

import de.ivu.elect.business.person.control.NlGeschlechtFilter;
import de.ivu.elect.business.person.entity.PersonendatenProperties.GeschlechtProperty;
import de.ivu.elect.business.personenpruefung.entity.NlPersonenKonfliktFinder;
import de.ivu.elect.jee.presentation.dynamicform.AbstractEnumProperty;
import de.ivu.elect.jee.presentation.dynamicform.Property;

public class NlPersonendatenProperties {

  private final Personendaten personendaten;

  private final PersonendatenProperties personendatenProperties;

  public NlPersonendatenProperties(Personendaten personendaten) {
    super();

    this.personendaten = personendaten;

    this.personendatenProperties = personendaten.getProperties();
  }

  public Property getOrdnungsmerkmalProperty() {
    return personendatenProperties.getExternesOrdnungsmerkmalProperty();
  }

  public Property getShortCodeProperty() {
    return personendatenProperties.getExterneIdProperty();
  }

  public Property getInitialenProperty() {
    return new NlInitialenProperty(personendaten); // ELECTVAPP-1483
  }

  public Property getVornameProperty() {
    return new NlRufnameProperty(personendaten); // ELECTVAPP-1887
  }

  public Property getFamiliennameProperty() {
    return new NlFamiliennameProperty(personendaten); // ELECTVAPP-1887
  }

  public Property getFamiliennameBestandteilProperty() {
    return personendatenProperties.getFamiliennameBestandteilProperty();
  }

  public Property getGeburtsdatumErfasstProperty() {
    return new NlGeburtsdatumProperty(personendaten);
  }

  public Property getGeschlechtProperty() {
    GeschlechtProperty geschlechtProperty = personendatenProperties.getGeschlechtProperty();
    geschlechtProperty.setValueFilter(new NlGeschlechtFilter()/* Abkürzung nur NL intern */);

    return geschlechtProperty;
  }

  // ELECT-11565
  public Property getPersonStatusProperty(NlPersonenKonfliktFinder personenKonfliktFinder) {
    return new AbstractEnumProperty<NlPersonStatus>() {

      @Override
      public boolean isReadonly() {
        return true;
      }

      @Override
      public boolean getDefaultRequired() {
        return false;
      }

      @Override
      public String getDefaultLabel() {
        return getMessage(PersonendatenConstants.MESSAGE_KEY_PERSON_STATUS_EINZAHL);
      }

      @Override
      public NlPersonStatus getValue() {
        return new NlPersonendaten(personendaten).getPersonStatus(personenKonfliktFinder);
      }

      @Override
      public void setValue(NlPersonStatus value) {
        // Readonly...
      }

      @Override
      public List<NlPersonStatus> getValues() {
        return asList(NlPersonStatus.values());
      }

      @Override
      public String getDefaultTooltip() {
        String result = super.getDefaultTooltip();

        PersonStatus personStatus = personendaten.getPersonStatus();
        PersonenregisterAbgleichStatus personenregisterAbgleichStatus = personendaten.getPersonenregisterAbgleichStatus();

        if (personStatus != null && personenregisterAbgleichStatus != null) {
          Date personenregisterAbgleichZeitpunkt = personendaten.getPersonenregisterAbgleichZeitpunkt();

          return defaultIfBlank(getMessage("PersonStatus." + personStatus.name() + "." + personenregisterAbgleichStatus.name(),
              personenregisterAbgleichZeitpunkt == null ? "" : DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(personenregisterAbgleichZeitpunkt)), result);
        }

        return result;
      }

      @Override
      protected Class<NlPersonStatus> getEnumClass() {
        return NlPersonStatus.class;
      }
    };
  }
}
