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

import static java.util.Arrays.asList;

/**
 *  on 16.08.2018.
 */
public enum WvpBenutzerStatus {

  INITIAL { // Benutzer wurde erstellt, aber noch kein Konto im Kandidtenportal angelegt

    @Override
    public boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus) {
      return false;
    }
  },

  KONTO_AKTIV { // Konto im Kandidtenportal angelegt und im Schreib-Modus

    @Override
    public boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus) {
      return asList(INITIAL, KONTO_READ_ONLY, KONTO_GELOESCHT).contains(vorgaengerStatus);
    }
  },

  KONTO_READ_ONLY { // Konto im Kandidtenportal angelegt und im Lese-Modus

    @Override
    public boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus) {
      return asList(KONTO_AKTIV).contains(vorgaengerStatus);
    }
  },

  KONTO_GELOESCHT { // Konto im Kandidtenportal wurde wieder gelöscht (kann noch wiederhergestellt werden)

    @Override
    public boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus) {
      return asList(KONTO_AKTIV, KONTO_READ_ONLY, DATEN_UEBERNOMMEN).contains(vorgaengerStatus);
    }
  },

  DATEN_UEBERNOMMEN { // Ähnlich KONTO_READ_ONLY, zusätzlich die Info, dass die Daten schon übernommen wurden.

    @Override
    public boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus) {
      return asList(KONTO_AKTIV, KONTO_READ_ONLY).contains(vorgaengerStatus);
    }
  };

  public abstract boolean isUeberschreibtStatus(WvpBenutzerStatus vorgaengerStatus);

  public boolean isKontoGeloescht() {
    return this.equals(KONTO_GELOESCHT);
  }

  public boolean isCreateAllowed() {
    return this.equals(INITIAL) || this.equals(KONTO_GELOESCHT);
  }

  public boolean isFixierenAllowed() {
    return this.equals(KONTO_AKTIV);
  }

  /**
   * @return true, wenn das Konto angelegt und NICHT gelöscht wurde
   */
  public boolean isKontoVorhanden() {
    return this.equals(KONTO_AKTIV) || this.equals(KONTO_READ_ONLY) || this.equals(DATEN_UEBERNOMMEN);
  }

  public boolean isKontoFixierungAufhebenAllowed() {
    return this.equals(KONTO_READ_ONLY) || this.equals(DATEN_UEBERNOMMEN);
  }

  public boolean isImportAllowed() {
    return !this.equals(INITIAL) && !isKontoGeloescht();
  }
}
