package com.l7tech.external.assertions.oauth2.introspection.server;

import com.l7tech.common.http.GenericHttpClient;
import com.l7tech.common.http.GenericHttpClientFactory;
import com.l7tech.external.assertions.oauth2.introspection.OAuth2IntrospectionAssertion;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthConfigEvent;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthGlobalTokenIssuerConfig;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthTokenIssuerConfig;
import com.l7tech.external.assertions.oauth2.introspection.config.OAuthTokenType;
import com.l7tech.external.assertions.oauth2.introspection.util.JsonUtil;
import com.l7tech.server.ServerConfig;
import com.l7tech.server.oauth2.OAuth2Issuer;
import com.l7tech.server.oauth2.OAuth2IssuerEvent;
import com.l7tech.server.transport.http.SslClientTrustManager;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.jetbrains.annotations.VisibleForTesting;
import org.springframework.context.ApplicationContext;

public final class OAuthTokenIssuerManager {
   private static final Logger a;
   public static final OAuthTokenIssuerManager INSTANCE;
   private final AtomicBoolean b = new AtomicBoolean();
   private final OAuthGlobalTokenIssuerConfig c = new OAuthGlobalTokenIssuerConfig();
   private OAuthTokenIssuer d;
   private OAuthTokenIssuer e;
   private Map<String, OAuthTokenIssuer> f = Collections.emptyMap();
   private final ScheduledExecutorService g = Executors.newScheduledThreadPool(2);
   private ScheduledFuture<?> h;
   private static final Set<String> i;
   private static final String[] j;

   public void configure(ServerConfig var1, OAuth2Issuer var2, ApplicationContext var3) {
      if (this.b.compareAndSet(false, true)) {
         this.c.refresh(var1);
         String[] var7 = j;
         SslClientTrustManager var4 = (SslClientTrustManager)var3.getBean(var7[1], SslClientTrustManager.class);
         GenericHttpClientFactory var5 = (GenericHttpClientFactory)var3.getBean(var7[8], GenericHttpClientFactory.class);
         GenericHttpClient var6 = var5.createHttpClient();
         this.b(var1, var6, var4);
         this.a(var6, var4, var2);
         this.a(var1, false);
         this.a(var1, var6, var4);
      }
   }

   public OAuthTokenIssuer getLocalTokenIssuer() {
      return this.d;
   }

   public OAuthTokenIssuer getDefaultTokenIssuer() {
      return this.e;
   }

   public OAuthTokenIssuer get(String var1) {
      try {
         if (var1 != null) {
            return this.f.get(var1);
         }
      } catch (OAuth2IntrospectionRuntimeException var2) {
         throw var2;
      }

      return null;
   }

   public List<String> getTokenIssuerNames() {
      return this.f.keySet().stream().sorted().toList();
   }

   @VisibleForTesting
   void a(OAuthTokenIssuer[] var1) {
      this.f = new HashMap<>();
      Arrays.stream(var1).forEach(var1x -> this.f.put(var1x.getName(), var1x));
   }

   private void a(ServerConfig var1, GenericHttpClient var2, SslClientTrustManager var3) {
      ConfigFactory.addListener(new b(this, var1, var2, var3), new String[0]);
   }

   private void a(ServerConfig var1, boolean var2) {
      try {
         if (this.h != null) {
            this.h.cancel(true);
         }
      } catch (OAuth2IntrospectionRuntimeException var5) {
         throw var5;
      }

      int var3 = var1.getIntProperty(OAuth2IntrospectionAssertion.JWKS_REFRESH_INTERVAL_CONFIG, 300);

      OAuthTokenIssuerManager var10000;
      ScheduledExecutorService var10001;
      Runnable var10002;
      long var10003;
      label22: {
         try {
            a.log(Level.INFO, j[5], var3);
            var10000 = this;
            var10001 = this.g;
            var10002 = () -> this.f.values().forEach(var0 -> var0.getTokenIntrospector().notify(OAuthConfigEvent.REFRESH_JWKS));
            if (var2) {
               var10003 = 0L;
               break label22;
            }
         } catch (OAuth2IntrospectionRuntimeException var4) {
            throw var4;
         }

         var10003 = var3;
      }

      var10000.h = var10001.scheduleAtFixedRate(var10002, var10003, var3, TimeUnit.SECONDS);
   }

   private void b(ServerConfig var1, GenericHttpClient var2, SslClientTrustManager var3) {
      try {
         OAuthTokenIssuerConfig[] var4 = JsonUtil.DEFAULT
            .jsonToJava(var1.getProperty(OAuth2IntrospectionAssertion.KNOWN_TOKEN_ISSUERS_CONFIG), OAuthTokenIssuerConfig[].class);
         this.f = Arrays.stream(var4)
            .filter(OAuthTokenIssuerConfig::isEnabled)
            .map(this::a)
            .map(var3x -> new OAuthTokenIssuer(var3x, this.g, var2, var3))
            .collect(Collectors.toMap(OAuthTokenIssuer::getName, var0 -> (OAuthTokenIssuer)var0, (var0, var1x) -> var1x));
         this.f
            .values()
            .stream()
            .filter(var0 -> OAuthTokenType.JWT.equals(var0.getConfig().getTokenType()))
            .forEach(var1x -> this.g.submit(() -> var1x.getTokenIntrospector().notify(OAuthConfigEvent.REFRESH_JWKS)));
         this.a(var1);
      } catch (Exception var5) {
         a.log(Level.WARNING, ExceptionUtils.getDebugException(var5), () -> j[7] + var5.getMessage());
      }
   }

   private void a(ServerConfig var1) {
      this.e = this.get(var1.getProperty(OAuth2IntrospectionAssertion.DEFAULT_TOKEN_ISSUER_CONFIG));
      a.log(Level.INFO, () -> {
         try {
            if (this.e != null) {
               return j[10] + this.e.getName();
            }
         } catch (OAuth2IntrospectionRuntimeException var2) {
            throw var2;
         }

         String[] var1x = j;
         return j[10] + var1x[0];
      });
   }

   private void a() {
      this.f.values().forEach(var0 -> var0.getTokenIntrospector().refreshTokenCache());
   }

   private OAuthTokenIssuerConfig a(OAuthTokenIssuerConfig param1) {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 1
      // 01: aload 0
      // 02: getfield com/l7tech/external/assertions/oauth2/introspection/server/OAuthTokenIssuerManager.c Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthGlobalTokenIssuerConfig;
      // 05: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.setGlobalConfig (Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthGlobalTokenIssuerConfig;)V
      // 08: getstatic com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType.JWT Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType;
      // 0b: aload 1
      // 0c: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getTokenType ()Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType;
      // 0f: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType.equals (Ljava/lang/Object;)Z
      // 12: ifeq 57
      // 15: aload 1
      // 16: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getJwks ()Ljava/util/Map;
      // 19: ifnull 30
      // 1c: goto 20
      // 1f: athrow
      // 20: aload 1
      // 21: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getJwks ()Ljava/util/Map;
      // 24: invokeinterface java/util/Map.isEmpty ()Z 1
      // 29: ifeq 57
      // 2c: goto 30
      // 2f: athrow
      // 30: aload 1
      // 31: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getJwksEndpoint ()Ljava/lang/String;
      // 34: invokestatic com/l7tech/external/assertions/oauth2/introspection/util/Util.isEmpty (Ljava/lang/String;)Z
      // 37: ifeq 57
      // 3a: goto 3e
      // 3d: athrow
      // 3e: new com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // 41: dup
      // 42: aload 1
      // 43: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getName ()Ljava/lang/String;
      // 46: getstatic com/l7tech/external/assertions/oauth2/introspection/server/OAuthTokenIssuerManager.j [Ljava/lang/String;
      // 49: bipush 9
      // 4b: aaload
      // 4c: swap
      // 4d: invokedynamic makeConcatWithConstants (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; bsm=java/lang/invoke/StringConcatFactory.makeConcatWithConstants (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; args=[ "\u0001\u0001" ]
      // 52: invokespecial com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException.<init> (Ljava/lang/String;)V
      // 55: athrow
      // 56: athrow
      // 57: getstatic com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType.OPAQUE Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType;
      // 5a: aload 1
      // 5b: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getTokenType ()Lcom/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType;
      // 5e: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenType.equals (Ljava/lang/Object;)Z
      // 61: ifne 78
      // 64: aload 1
      // 65: getstatic com/l7tech/external/assertions/oauth2/introspection/server/OAuthTokenIssuerManager.j [Ljava/lang/String;
      // 68: bipush 6
      // 6a: aaload
      // 6b: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getBooleanProperty (Ljava/lang/String;)Ljava/lang/Boolean;
      // 6e: invokevirtual java/lang/Boolean.booleanValue ()Z
      // 71: ifeq 9e
      // 74: goto 78
      // 77: athrow
      // 78: aload 1
      // 79: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getIntrospectionEndpoint ()Ljava/lang/String;
      // 7c: invokestatic com/l7tech/external/assertions/oauth2/introspection/util/Util.isEmpty (Ljava/lang/String;)Z
      // 7f: ifeq 9e
      // 82: goto 86
      // 85: athrow
      // 86: new com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // 89: dup
      // 8a: aload 1
      // 8b: invokevirtual com/l7tech/external/assertions/oauth2/introspection/config/OAuthTokenIssuerConfig.getName ()Ljava/lang/String;
      // 8e: getstatic com/l7tech/external/assertions/oauth2/introspection/server/OAuthTokenIssuerManager.j [Ljava/lang/String;
      // 91: bipush 2
      // 92: aaload
      // 93: swap
      // 94: invokedynamic makeConcatWithConstants (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; bsm=java/lang/invoke/StringConcatFactory.makeConcatWithConstants (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; args=[ "\u0001\u0001" ]
      // 99: invokespecial com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException.<init> (Ljava/lang/String;)V
      // 9c: athrow
      // 9d: athrow
      // 9e: aload 1
      // 9f: areturn
      // try (0 -> 12): 13 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (9 -> 18): 19 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (14 -> 24): 25 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (20 -> 37): 37 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (38 -> 50): 51 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (43 -> 56): 57 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
      // try (52 -> 69): 69 com/l7tech/external/assertions/oauth2/introspection/server/OAuth2IntrospectionRuntimeException
   }

   private void a(GenericHttpClient var1, SslClientTrustManager var2, OAuth2Issuer var3) {
      try {
         OAuthTokenIssuerConfig var4 = new OAuthTokenIssuerConfig();
         var4.setEnabled(true);
         var4.setTokenType(OAuthTokenType.JWT);
         var4.setName(var3.getName());
         var4.setJwks(JsonUtil.DEFAULT.jsonToJava(var3.getJwks(), Map.class));
         var4.setJwksSupplier(var3::getJwks);
         OAuthTokenIssuer var5 = new OAuthTokenIssuer(var4, this.g, var1, var2);
         var5.getTokenIntrospector().notify(OAuthConfigEvent.REFRESH_JWKS);
         var3.addListener(var1x -> {
            try {
               if (OAuth2IssuerEvent.JWKS_REFRESHED.equals(var1x)) {
                  var5.getTokenIntrospector().notify(OAuthConfigEvent.REFRESH_JWKS);
               }
            } catch (OAuth2IntrospectionRuntimeException var2x) {
               throw var2x;
            }
         });
         this.d = var5;
         String[] var6 = j;
         a.log(Level.INFO, var6[3]);
      } catch (Exception var7) {
         a.log(Level.WARNING, j[4] + ExceptionUtils.getMessage(var7));
      }
   }

   static {
      String[] var5 = new String[11];
      int var3 = 0;
      String var2 = "\u001f\u0006:\u0018\u0013\u0003\u0006!\th\"\u0019%\u001b!\u000eu\u0001\u001f\u001f\b3\u0018s.8\u0007 \u000fn?\u000e\u0014\n \u0014n\"^\u0014\u00070\rn%\u0010\u0005I=\u000e!\"\u0011\u0005I0\u0018g%\u0010\u0014\rx]h?\r\u0004\f&@:6\b \u0018v-\u0007Q\u0000']u>\u000b\u0002\u001d1\u0019!*\u0011\u0003I6\u0018h\"\u0019Q\u001d<\u0018!'\u0010\u001e\u001e:]N\r+%!f]u#\u0015\u0014\u0007t\u0014r?\u000b\u0014\u001bR4\u001b&\u0012sl\u001b\u001f\n;\bo8\u001b\u0003\f0]v$\u0017\u001d\ft\u001en\"\u0018\u0018\u000e!\u000fh\"\u0019Q\u001d<\u0018!\u000b\u001f\u0005\f#\u001cxl\u001f\u0002I \u0015dl\u0015\u001f\u0006#\u0013!\u0003?\u0004\u001d<O!8\u0011\u001a\f:]h?\r\u0004\f&Q!,\"\n<\u0018e9\u0012\u0018\u00073]k;\u0015\u0002I&\u0018g>\u001b\u0002\u0001t\t`?\u0015Q\u001e=\til\u000e\u0014\u001b=\u0012eq\u0005A\u0014\u0018\u0004\u001a1\"s)\u0013\u001e\u001d1\"h\"\n\u0003\u0006'\rd/\n\u0018\u0006:84\u001b&\u0012sl\u001b\u001f\n;\bo8\u001b\u0003\f0]h\"^\u0001\b&\u000eh\"\u0019Q\u001d<\u0018!'\u0010\u001e\u001e:]h?\r\u0004\f&\u000e!(\u001b\u0005\b=\u0011rv^\u0011\u0019\u001d \rB \u0017\u0014\u0007 ;`/\n\u001e\u001b-";
      int var4 = "\u001f\u0006:\u0018\u0013\u0003\u0006!\th\"\u0019%\u001b!\u000eu\u0001\u001f\u001f\b3\u0018s.8\u0007 \u000fn?\u000e\u0014\n \u0014n\"^\u0014\u00070\rn%\u0010\u0005I=\u000e!\"\u0011\u0005I0\u0018g%\u0010\u0014\rx]h?\r\u0004\f&@:6\b \u0018v-\u0007Q\u0000']u>\u000b\u0002\u001d1\u0019!*\u0011\u0003I6\u0018h\"\u0019Q\u001d<\u0018!'\u0010\u001e\u001e:]N\r+%!f]u#\u0015\u0014\u0007t\u0014r?\u000b\u0014\u001bR4\u001b&\u0012sl\u001b\u001f\n;\bo8\u001b\u0003\f0]v$\u0017\u001d\ft\u001en\"\u0018\u0018\u000e!\u000fh\"\u0019Q\u001d<\u0018!\u000b\u001f\u0005\f#\u001cxl\u001f\u0002I \u0015dl\u0015\u001f\u0006#\u0013!\u0003?\u0004\u001d<O!8\u0011\u001a\f:]h?\r\u0004\f&Q!,\"\n<\u0018e9\u0012\u0018\u00073]k;\u0015\u0002I&\u0018g>\u001b\u0002\u0001t\t`?\u0015Q\u001e=\til\u000e\u0014\u001b=\u0012eq\u0005A\u0014\u0018\u0004\u001a1\"s)\u0013\u001e\u001d1\"h\"\n\u0003\u0006'\rd/\n\u0018\u0006:84\u001b&\u0012sl\u001b\u001f\n;\bo8\u001b\u0003\f0]h\"^\u0001\b&\u000eh\"\u0019Q\u001d<\u0018!'\u0010\u001e\u001e:]h?\r\u0004\f&\u000e!(\u001b\u0005\b=\u0011rv^\u0011\u0019\u001d \rB \u0017\u0014\u0007 ;`/\n\u001e\u001b-"
         .length();
      char var1 = 4;
      int var7 = -1;

      label24:
      while (true) {
         String var10000 = var2.substring(++var7, var7 + var1);
         byte var10001 = -1;

         while (true) {
            String var12 = a(a(var10000));
            switch (var10001) {
               case 0:
                  var5[var3++] = var12;
                  if ((var7 += var1) >= var4) {
                     j = var5;
                     a = Logger.getLogger(OAuthTokenIssuerManager.class.getName());
                     INSTANCE = new OAuthTokenIssuerManager();
                     i = new HashSet<>(
                        Arrays.asList(
                           OAuth2IntrospectionAssertion.KNOWN_TOKEN_ISSUERS_CONFIG,
                           OAuth2IntrospectionAssertion.DEFAULT_TOKEN_ISSUER_CONFIG,
                           OAuth2IntrospectionAssertion.TOKEN_CACHE_SIZE_CONFIG,
                           OAuth2IntrospectionAssertion.TOKEN_CACHE_ITEM_LIFETIME_CONFIG,
                           OAuth2IntrospectionAssertion.JWKS_REFRESH_INTERVAL_CONFIG,
                           OAuth2IntrospectionAssertion.JWKS_READ_TIMEOUT_CONFIG
                        )
                     );
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var12;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = ";>\u001f.!?\u0011\u0004\u001b7\u0018!%\rQ\u0007;\t!(\u001b\u0017\u0000:\u0018e`^\u0018\u001a'\bd>C\u001e5\f2\u001ct \nQ\u0002:\u0012v\"^\u0005\u0006?\u0018ol\u0017\u0002\u001a!\u0018sl\u0017\u0002I";
                  var4 = ";>\u001f.!?\u0011\u0004\u001b7\u0018!%\rQ\u0007;\t!(\u001b\u0017\u0000:\u0018e`^\u0018\u001a'\bd>C\u001e5\f2\u001ct \nQ\u0002:\u0012v\"^\u0005\u0006?\u0018ol\u0017\u0002\u001a!\u0018sl\u0017\u0002I"
                     .length();
                  var1 = '#';
                  var7 = -1;
            }

            var10000 = var2.substring(++var7, var7 + var1);
            var10001 = 0;
         }
      }
   }

   private static char[] a(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 126);
      }

      return var10000;
   }

   private static String a(char[] var0) {
      int var10002 = var0.length;
      char[] var10001 = var0;
      int var10000 = var10002;

      for (int var1 = 0; var10000 > var1; var1++) {
         var10001[var1] = (char)(var10001[var1] ^ switch (var1 % 7) {
            case 0 -> 113;
            case 1 -> 105;
            case 2 -> 84;
            case 3 -> 125;
            case 4 -> 1;
            case 5 -> 76;
            default -> 126;
         });
      }

      return new String(var10001).intern();
   }
}
