
package de.ivu.elect.jee.security;

import java.io.Serializable;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

/**
 * Factory für LoginService ... zu spezialisieren.
 */
@ApplicationScoped
public class LoginServiceFactory implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final String ADMIN_KENNUNG = "admin";

  @Inject
  private transient LoginServiceFinder loginServiceFinder;

  public LoginService getLoginService(Long mandantenNummer) {
    return loginServiceFinder.getLoginService(getLoginServiceName(mandantenNummer));
  }

  /**
   * Diese Methode überschreiben, um den Namen des zu verwendenen Service anzugeben
   */
  protected String getLoginServiceName(Long mandantenNummer) {
    return "SPECIALISE-ME";
  }

  /**
   * Ist die übergebene Entität der Admin-User?
   */
  public boolean isAdminUser(Login< ? > login) {
    return login != null && isAdminKennung(login.getBenutzerkennung());
  }

  public static boolean isAdminKennung(String kennung) {
    return ADMIN_KENNUNG.equalsIgnoreCase(kennung);
  }


  public boolean isBenutzernameKannGewechseltWerden(Login< ? > login) {
    // die Admin kennung kann nicht geändert werden
    if (isAdminUser(login)) {
      return false;
    }

    return getLoginService(login.getMandantenNummer()).isBenutzernameKannGewechseltWerden(login.getMandantenNummer());
  }

  public boolean isGruppenUebernehmen(Long mandantenNummer) {
    return getLoginService(mandantenNummer).isGruppenUebernehmen(mandantenNummer);
  }


  public boolean isPasswortWechselnMoeglich(Long mandantenNummer) {
    return getLoginService(mandantenNummer).isPasswortWechselnMoeglich(mandantenNummer);
  }

  public String getPasswortFormatPattern(Long mandantenNummer) {
    return getLoginService(mandantenNummer).getPasswortFormatPattern(mandantenNummer);
  }

  public String getPasswortFormatBeschreibung(Long mandantenNummer) {
    return getLoginService(mandantenNummer).getPasswortFormatBeschreibung(mandantenNummer);
  }

  public boolean isBenutzerAnlegenMoeglich(Long mandantenNummer) {
    return getLoginService(mandantenNummer).isBenutzerAnlegenMoeglich(mandantenNummer);
  }

  public boolean isSperrenMoeglich(Long mandantenNummer) {
    return getLoginService(mandantenNummer).isSperrenMoeglich(mandantenNummer);
  }


}
