package com.airlock.iam.plugin.framework.misc.util;

import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.plugin.api.exception.PluginClassLoadingException;
import com.airlock.iam.plugin.api.valuereader.PluginPropertyValueReader;
import com.airlock.iam.plugin.impl.cache.PluginClassCache;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

public final class GlobalConfigUtils {
   private GlobalConfigUtils() {
   }

   public static Set<String> getGlobalReferencesForPlugin(Class<?> pluginClass) {
      return new HashSet<>(getPropertyToGlobalReferenceMap(pluginClass).values());
   }

   public static Optional<String> getGlobalReferenceForPluginProperty(Class<?> pluginClass, String propertyName) {
      return Optional.ofNullable(getPropertyToGlobalReferenceMap(pluginClass).get(propertyName));
   }

   public static Map<String, String> getPropertyToGlobalReferenceMap(Class<?> pluginClass) {
      try {
         Map<String, String> fieldToReference = new HashMap<>();

         for (Field field : PluginClassCache.collectAllAnnotatedFields(pluginClass, PluginProperty.class)) {
            PluginProperty annotation = field.getAnnotation(PluginProperty.class);
            if (PluginPropertyValueReader.hasGlobalReference(annotation)) {
               fieldToReference.put(field.getName(), annotation.globalPluginReference());
            }
         }

         return fieldToReference;
      } catch (PluginClassLoadingException e) {
         return Collections.emptyMap();
      }
   }
}
