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

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toList;

import java.util.List;

import de.ivu.elect.business.personenpruefung.entity.NlPersonenKonfliktFinder;
import de.ivu.elect.jee.presentation.Icons;

// ELECT-11565
public enum NlPersonStatus {

  UNBEKANNT,

  // Fachlich nicht relevant, aber zum vollständigen Mapping PersonStatus -> NlPersonStatus (per Enum#name) notwendig!
  NICHT_ZU_PRUEFEN,

  UNGEPRUEFT,
  MANUELL_ZU_PRUEFENDER_KONFLIKT_VORHANDEN,
  NICHT_GEEIGNET,
  GEEIGNET,
  GEEIGNET_AUTOMATISCH,
  GEEIGNET_MANUELL,

  ;

  NlPersonStatus() {
  }

  public String getIcon(Icons icons) {
    if (isValueInPersonenregisterAbgleich()) {
      if (isValueGeeignet()) {
        return PersonStatus.GEEIGNET.getIcon(icons);
      }

      return PersonStatus.valueOf(name()).getIcon(icons);
    }

    return PersonStatus.NICHT_ZU_PRUEFEN.getIcon(icons);
  }

  boolean isValueGeeignet() {
    return GEEIGNET.equals(this) || GEEIGNET_AUTOMATISCH.equals(this) || GEEIGNET_MANUELL.equals(this);
  }

  public boolean isValueInPersonenregisterAbgleich() {
    return !UNBEKANNT.equals(this) && !NICHT_ZU_PRUEFEN.equals(this);
  }

  public static List<NlPersonStatus> valuesInPersonenregisterAbgleich() {
    return stream(values()).filter(NlPersonStatus::isValueInPersonenregisterAbgleich).collect(toList());
  }

  public static NlPersonStatus valueOf(Personendaten personendaten, NlPersonenKonfliktFinder personenKonfliktFinder) {
    if (personendaten == null) {
      return UNBEKANNT;
    }

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

    if (personStatus != null && personenregisterAbgleichStatus == null) {
      return valueOf(personStatus.name()); // LEGACY-Fallback...
    }

    if (PersonStatus.UNGEPRUEFT.equals(personStatus)) {
      return UNGEPRUEFT;
    }

    if (PersonStatus.MANUELL_ZU_PRUEFENDER_KONFLIKT_VORHANDEN.equals(personStatus)) {
      if (PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG.equals(personenregisterAbgleichStatus)) {
        return UNGEPRUEFT;
      }

      return MANUELL_ZU_PRUEFENDER_KONFLIKT_VORHANDEN;
    }

    if (PersonStatus.NICHT_GEEIGNET.equals(personStatus)) {
      if (PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG.equals(personenregisterAbgleichStatus)) {
        return UNGEPRUEFT;
      }

      if (PersonenregisterAbgleichStatus.ABGLEICH_DURCHGEFUEHRT.equals(personenregisterAbgleichStatus)) {
        return NICHT_GEEIGNET;
      }
    }

    if (PersonStatus.GEEIGNET.equals(personStatus)) {
      if (PersonenregisterAbgleichStatus.ABGLEICH_NOTWENDIG.equals(personenregisterAbgleichStatus)) {
        return UNGEPRUEFT;
      }

      if (PersonenregisterAbgleichStatus.ABGLEICH_DURCHGEFUEHRT.equals(personenregisterAbgleichStatus)) {
        if (personenKonfliktFinder.isEnabled()) {
          if (personenKonfliktFinder.isPersonenregisterAbgleichStatusManuellGeprueft(personendaten)) {
            return GEEIGNET_MANUELL;
          }

          return GEEIGNET_AUTOMATISCH;
        }

        return GEEIGNET;
      }
    }

    return UNBEKANNT;
  }
}
