package com.airlock.iam.login.rest.application.configuration.saml2;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.PropertyConfigurationException;
import com.airlock.iam.plugin.api.exception.PropertyTypeMismatchException;
import com.airlock.iam.plugin.api.valuereader.PluginPropertyValueReader;
import com.airlock.iam.plugin.api.valuereader.StringPropertyValueReader;
import com.airlock.iam.plugin.framework.application.configuration.PluginConfigurationWrapper;
import com.airlock.iam.saml2.application.configuration.Saml2ServiceProviderAccessConfig;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public final class Saml2ServiceProviderAccessPluginConfiguration extends PluginConfigurationWrapper<Saml2ServiceProviderAccessConfig> {
   private final ConfigurationEnvironment environment;
   private final ConfigurationContext context;

   public Saml2ServiceProviderAccessPluginConfiguration(PluginConfiguration spConfig, ConfigurationEnvironment environment, ConfigurationContext context) {
      super(spConfig);
      this.environment = environment;
      this.context = context;
   }

   public String getEntityId() {
      try {
         PluginConfiguration spEntityId = (PluginConfiguration)this.getEffectivePluginPropertyValue("spEntityConfig", this.environment, this.context).get();
         PluginConfiguration spId = PluginPropertyValueReader.effectivePluginPropertyValue(spEntityId, "entityId", this.environment, this.context);
         return StringPropertyValueReader.effectiveStringConfigValue(spId, "spEntityId", this.environment, this.context);
      } catch (PropertyConfigurationException e) {
         throw new FailureException(e);
      }
   }

   public String defaultFlowApplicationId() {
      try {
         PluginConfiguration defaultFlowApplicationIdConfig = (PluginConfiguration)this.getEffectivePluginPropertyValue(
               "defaultFlowApplicationId", this.environment, this.context
            )
            .get();
         return StringPropertyValueReader.effectiveStringConfigValue(defaultFlowApplicationIdConfig, "applicationId", this.environment, this.context);
      } catch (PropertyConfigurationException e) {
         throw new FailureException(e);
      }
   }

   public List<PluginConfiguration> authnContexts() throws PropertyTypeMismatchException, PropertyConfigurationException {
      return this.getEffectivePluginListPropertyValue("requestedAuthnContextToFlowAppId", this.environment, this.context);
   }

   public Set<String> authnContextFlowApplicationIds() throws PropertyTypeMismatchException, PropertyConfigurationException {
      Set<String> authnContextAppIds = new HashSet<>();

      for (PluginConfiguration authnContext : this.authnContexts()) {
         PluginConfiguration flowApplicationIdConfig = PluginPropertyValueReader.effectivePluginPropertyValue(
            authnContext, "flowApplicationId", this.environment, this.context
         );
         authnContextAppIds.add(StringPropertyValueReader.effectiveStringConfigValue(flowApplicationIdConfig, "applicationId", this.environment, this.context));
      }

      return authnContextAppIds;
   }
}
