
package de.ivu.elect.presentation.security;

import java.io.Serializable;
import java.util.Optional;

import javax.inject.Inject;

import de.ivu.elect.business.personenpruefung.entity.PersonenKonflikt;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.security.entity.EntityMitSperrmerkmal;

public class SperrmerkmalSecurityDefinition implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ElectCommonPrincipal principal;

  public SperrmerkmalSecurityDefinition() {
    super();
  }

  public boolean isSperreHervorzuheben(Object entity) {
    return isSperreVorhanden(entity);
  }

  public boolean isSperreEinsehbar(Object entity) {
    return whenEntityMitSperrmerkmal(entity).map(this::isSperreEinsehbarInternal).orElse(true);
  }

  protected boolean isSperreEinsehbarInternal(EntityMitSperrmerkmal entityMitSperrmerkmal) {
    return isSperreBearbeitbar(entityMitSperrmerkmal);
  }

  public boolean isSperreBearbeitbar(Object entity) {
    return whenEntityMitSperrmerkmal(entity).map(this::isSperreBearbeitbarInternal).orElse(true);
  }

  protected boolean isSperreBearbeitbarInternal(EntityMitSperrmerkmal entityMitSperrmerkmal) {
    return !isSperreVorhanden(entityMitSperrmerkmal) || entityMitSperrmerkmal.isSperrmerkmalBerechtigt(getCurrentPrincipal());
  }

  public boolean isSperreVorhanden(Object entity) {
    return whenEntityMitSperrmerkmal(entity).map(this::isSperreVorhandenInternal).orElse(false);
  }

  protected boolean isSperreVorhandenInternal(EntityMitSperrmerkmal entityMitSperrmerkmal) {
    return entityMitSperrmerkmal.isSperrmerkmalGesetzt();
  }

  private Optional<EntityMitSperrmerkmal> whenEntityMitSperrmerkmal(Object entity) {
    if (entity instanceof EntityMitSperrmerkmal) {
      return Optional.of((EntityMitSperrmerkmal) entity);
    }

    return Optional.empty();
  }

  protected boolean matchesEntityMitSperrmerkmalClass(EntityMitSperrmerkmal entityMitSperrmerkmal,
      Class< ? extends EntityMitSperrmerkmal> entityClazz) {
    if (entityClazz.isInstance(entityMitSperrmerkmal)) {
      return true;
    }

    if (entityMitSperrmerkmal instanceof PersonenKonflikt) {
      return ((PersonenKonflikt) entityMitSperrmerkmal).getPersonendaten().isInstanceOf(entityClazz);
    }

    return false;
  }

  protected ElectCommonPrincipal getCurrentPrincipal() {
    return principal;
  }
}
