package com.airlock.iam.authentication.application.configuration.ui;

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.PropertyTypeMismatchException;
import com.airlock.iam.plugin.api.valuereader.PluginListPropertyValueReader;
import com.airlock.iam.plugin.api.valuereader.PluginPropertyValueReader;
import com.airlock.iam.plugin.api.valuereader.StringPropertyValueReader;
import jakarta.annotation.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

public final class AuthenticationUiConfigValidatorUtil {
   private AuthenticationUiConfigValidatorUtil() {
   }

   public static List<PluginConfiguration> authenticationUiConfigs(
      Optional<PluginConfiguration> authUiConfigs, ConfigurationEnvironment env, ConfigurationContext context
   ) throws PropertyTypeMismatchException {
      return authUiConfigs.isEmpty()
         ? Collections.emptyList()
         : PluginListPropertyValueReader.effectivePluginListPropertyValue(authUiConfigs.get(), "flowUis", env, context);
   }

   public static Optional<String> extractApplicationId(
      @Nullable PluginConfiguration pc, String property, ConfigurationEnvironment env, ConfigurationContext context
   ) throws PropertyTypeMismatchException {
      if (pc == null) {
         return Optional.empty();
      }

      PluginConfiguration idConfig = PluginPropertyValueReader.effectivePluginPropertyValue(pc, property, env, context);
      return extractApplicationIdFromIdConfig(idConfig, env, context);
   }

   public static Optional<String> extractApplicationIdFromIdConfig(PluginConfiguration idConfig, ConfigurationEnvironment env, ConfigurationContext context) throws PropertyTypeMismatchException {
      return idConfig == null
         ? Optional.empty()
         : Optional.ofNullable(StringPropertyValueReader.effectiveStringConfigValue(idConfig, "applicationId", env, context));
   }
}
