
package de.ivu.elect.business.system.control;

import de.ivu.elect.business.benutzerverwaltung.boundary.RechteKonfigurationStore;
import de.ivu.elect.business.konfiguration.entity.KonfigurationNewTransaktionLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.system.boundary.SystemStatusStore;
import de.ivu.elect.business.system.entity.ElectSimplePrincipal;

import javax.inject.Inject;
import java.io.Serializable;

import static de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte.ADMIN_ROLLE_IGNORIERT_PRODUKTIONSMODUS;

@Deprecated // Code nach AbstractElectUseCasePermissionFilter verschieben
public class SystemStatusPermissions implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient SystemStatusStore systemStatusStore;

  @Inject
  private transient RechteKonfigurationStore rechteKonfigurationStore;

  @Inject
  private transient KonfigurationNewTransaktionLoader konfigurationLoader;

  public SystemStatusPermissions() {
    super();
  }

  public boolean hasUseCasePermission(ElectSimplePrincipal principal, UseCasePermission useCasePermission) {
    return checkNonAdminUseCasePermission(principal, useCasePermission) || isAdminAusreichend(principal);
  }

  protected boolean isAdminAusreichend(ElectSimplePrincipal principal) {
    return principal.isAdmin() && konfigurationLoader.resolveBooleanValue(principal.getMandant(), ADMIN_ROLLE_IGNORIERT_PRODUKTIONSMODUS);
  }

  protected boolean checkNonAdminUseCasePermission(ElectSimplePrincipal principal, UseCasePermission useCasePermission) {
    // WASDE-554 wenn das System nicht im Testmodus ist, sind alle Rechte, die nur im Testmodus vorhanden sind, deaktiviert, es sei denn, es ist der Admin, der darf alles...
    if (!systemStatusStore.isTestmodusEnabled(principal.getMandantPK()) && rechteKonfigurationStore.getRechteFuerTestmodus(principal.getMandantPK()).contains(useCasePermission)) {
      return false;
    }

    return true;
  }
}
