package com.airlock.iam.admin.domain.model.contextdata;

import com.airlock.iam.admin.api.domain.model.administrator.CurrentAdministrator;
import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.misc.log.LogUtil;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Map;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;

public final class AdminRealmContextDataName {
   private final String contextDataName;

   public Optional<String> getValidatedValue(CurrentAdministrator administrator) {
      return administrator.contextData(this.contextDataName).map(value -> validateStringType(value, administrator)).filter(StringUtils::isNotBlank);
   }

   public boolean hasValueIn(Map<String, Object> contextDataContainer) {
      return Optional.ofNullable(contextDataContainer.get(this.contextDataName))
         .filter(String.class::isInstance)
         .map(String.class::cast)
         .filter(StringUtils::isNotBlank)
         .isPresent();
   }

   private static String validateStringType(Object contextDataValue, CurrentAdministrator currentAdministrator) {
      if (contextDataValue instanceof String) {
         return (String)contextDataValue;
      } else {
         throw new FailureException(
            String.format(
               "Invalid type %s of admin realm context data for admin %s.",
               LogUtil.quote(contextDataValue.getClass().getTypeName()),
               LogUtil.quote(currentAdministrator.getName())
            )
         );
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public AdminRealmContextDataName(String contextDataName) {
      this.contextDataName = contextDataName;
   }
}
