package com.airlock.iam.common.infrastructure.service;

import com.airlock.iam.common.application.service.JwksService;
import com.airlock.iam.common.domain.service.JwksPublicKeyRegistry;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.event.ConfigurationActivationNotifier;
import com.airlock.iam.plugin.api.event.ConfigurationActivationNotifier.ActivationCallback;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

public final class JwksProvider implements ActivationCallback {
   private static final JwksProvider INSTANCE = new JwksProvider();
   private final JwksService service = new JwksServiceImpl();
   private final Set<ConfigurationContext> contextEnabled = Collections.newSetFromMap(new ConcurrentHashMap<>());

   private JwksProvider() {
      ConfigurationActivationNotifier.registerCallback(this);
   }

   public static Optional<JwksService> getInstance(ConfigurationContext context) {
      return INSTANCE.contextEnabled.contains(context) ? Optional.of(INSTANCE.service) : Optional.empty();
   }

   public static void register(JwksPublicKeyRegistry registry) {
      INSTANCE.service.register(registry);
   }

   public static void deregister(JwksPublicKeyRegistry registry) {
      INSTANCE.service.deregister(registry);
   }

   public static void setEnabled(ConfigurationContext context, boolean enable) {
      if (enable) {
         INSTANCE.contextEnabled.add(context);
      } else {
         INSTANCE.contextEnabled.remove(context);
      }
   }

   public void configurationActivated() {
      if (!INSTANCE.contextEnabled.isEmpty()) {
         INSTANCE.service.reload();
      }
   }
}
