package com.l7tech.external.assertions.gatewaygraphql.server.resolver.query;

import com.l7tech.external.assertions.gatewaygraphql.EntityTypeInfo;
import com.l7tech.external.assertions.gatewaygraphql.server.data.IdpDTO;
import com.l7tech.identity.Group;
import com.l7tech.identity.Identity;
import com.l7tech.identity.IdentityProvider;
import com.l7tech.identity.IdentityProviderConfig;
import com.l7tech.identity.IdentityProviderType;
import com.l7tech.identity.User;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.IdentityHeader;
import com.l7tech.server.search.objects.Dependency;
import com.l7tech.server.search.objects.DependentEntity;
import com.l7tech.util.Pair;
import graphql.schema.DataFetchingEnvironment;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public abstract class IdpEntityAwareGraphQLQueryResolver<IDPC extends IdentityProviderConfig, IDP extends IdentityProvider, EO extends IdpDTO<IDPC, IDP>>
   extends BasicGraphQLQueryResolver {
   protected final IdpResolverHelper idpHelper;
   protected final IdentityProviderType idpType;
   private static final String e;

   protected IdpEntityAwareGraphQLQueryResolver(EntityTypeInfo var1, ExecutorService var2, IdpResolverHelper var3, IdentityProviderType var4) {
      super(var1, var2);
      this.idpHelper = var3;
      this.idpType = var4;
   }

   protected boolean isInterestedIdp(IdentityProvider<?, ?, ?, ?> var1) {
      try {
         if (var1.getConfig().type().toVal() == this.idpType.toVal()) {
            return true;
         }
      } catch (RuntimeException var2) {
         throw a(var2);
      }

      return false;
   }

   protected void checkInterestedIdp(IdentityProvider<?, ?, ?, ?> var1) {
      try {
         if (!this.isInterestedIdp(var1)) {
            throw new RuntimeException(e + this.idpType.description());
         }
      } catch (RuntimeException var2) {
         throw a(var2);
      }
   }

   protected IDPC getIdpConfig(IdentityProvider<?, ?, ?, ?> var1) {
      return (IDPC)var1.getConfig();
   }

   protected abstract EO toEntityDTO(IDPC var1);

   protected IDPC findByName(String var1) throws FindException {
      IdentityProvider var2 = this.idpHelper.idpByName(var1);

      try {
         if (var2 != null) {
            this.checkInterestedIdp(var2);
            return this.getIdpConfig(var2);
         } else {
            return null;
         }
      } catch (FindException var3) {
         throw a(var3);
      }
   }

   protected IDPC findByGoid(Goid var1) throws FindException {
      IdentityProvider var2 = this.idpHelper.idpByGoid(var1);

      try {
         if (var2 != null) {
            this.checkInterestedIdp(var2);
            return this.getIdpConfig(var2);
         } else {
            return null;
         }
      } catch (FindException var3) {
         throw a(var3);
      }
   }

   protected Collection<IDPC> findAll() throws FindException {
      return this.idpHelper.idps(this::isInterestedIdp).<IDPC>map(IdentityProvider::getConfig).toList();
   }

   protected final IdentityProviderConfig findByDependent(DependentEntity var1) throws FindException {
      IdentityProvider var2 = this.idpHelper.idpByGoid(var1.getEntityHeader().getGoid());

      try {
         if (var2 != null) {
            return var2.getConfig();
         }
      } catch (FindException var3) {
         throw a(var3);
      }

      return null;
   }

   protected final IdentityProviderConfig findByDependentQuietly(DependentEntity var1) {
      try {
         return this.findByDependent(var1);
      } catch (Throwable var3) {
         throw var3;
      }
   }

   protected final Collection<IDPC> findMultipleByDependencies(Collection<Dependency> param1, DependentEntityCacheProvider.DependentEntityCache param2) {
      // $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: new java/util/ArrayList
      // 03: dup
      // 04: invokespecial java/util/ArrayList.<init> ()V
      // 07: astore 3
      // 08: aload 1
      // 09: invokeinterface java/util/Collection.iterator ()Ljava/util/Iterator; 1
      // 0e: astore 4
      // 10: aload 4
      // 12: invokeinterface java/util/Iterator.hasNext ()Z 1
      // 17: ifeq 71
      // 1a: aload 4
      // 1c: invokeinterface java/util/Iterator.next ()Ljava/lang/Object; 1
      // 21: checkcast com/l7tech/server/search/objects/Dependency
      // 24: astore 5
      // 26: aload 5
      // 28: invokevirtual com/l7tech/server/search/objects/Dependency.getDependent ()Lcom/l7tech/server/search/objects/DependentObject;
      // 2b: checkcast com/l7tech/server/search/objects/DependentEntity
      // 2e: astore 6
      // 30: aload 2
      // 31: aload 6
      // 33: aload 0
      // 34: aload 6
      // 36: invokedynamic get (Lcom/l7tech/external/assertions/gatewaygraphql/server/resolver/query/IdpEntityAwareGraphQLQueryResolver;Lcom/l7tech/server/search/objects/DependentEntity;)Ljava/util/function/Supplier; bsm=java/lang/invoke/LambdaMetafactory.metafactory (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; args=[ ()Ljava/lang/Object;, com/l7tech/external/assertions/gatewaygraphql/server/resolver/query/IdpEntityAwareGraphQLQueryResolver.lambda$findMultipleByDependencies$0 (Lcom/l7tech/server/search/objects/DependentEntity;)Lcom/l7tech/identity/IdentityProviderConfig;, ()Lcom/l7tech/identity/IdentityProviderConfig; ]
      // 3b: invokevirtual com/l7tech/external/assertions/gatewaygraphql/server/resolver/query/DependentEntityCacheProvider$DependentEntityCache.get (Lcom/l7tech/server/search/objects/DependentEntity;Ljava/util/function/Supplier;)Lcom/l7tech/objectmodel/Entity;
      // 3e: checkcast com/l7tech/identity/IdentityProviderConfig
      // 41: astore 7
      // 43: aload 7
      // 45: ifnull 6e
      // 48: aload 7
      // 4a: invokevirtual com/l7tech/identity/IdentityProviderConfig.getTypeVal ()I
      // 4d: aload 0
      // 4e: getfield com/l7tech/external/assertions/gatewaygraphql/server/resolver/query/IdpEntityAwareGraphQLQueryResolver.idpType Lcom/l7tech/identity/IdentityProviderType;
      // 51: invokevirtual com/l7tech/identity/IdentityProviderType.toVal ()I
      // 54: if_icmpne 6e
      // 57: goto 5e
      // 5a: invokestatic com/l7tech/external/assertions/gatewaygraphql/server/resolver/query/IdpEntityAwareGraphQLQueryResolver.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 5d: athrow
      // 5e: aload 3
      // 5f: aload 7
      // 61: invokeinterface java/util/List.add (Ljava/lang/Object;)Z 2
      // 66: pop
      // 67: goto 6e
      // 6a: invokestatic com/l7tech/external/assertions/gatewaygraphql/server/resolver/query/IdpEntityAwareGraphQLQueryResolver.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 6d: athrow
      // 6e: goto 10
      // 71: aload 3
      // 72: areturn
      // try (26 -> 34): 35 java/lang/RuntimeException
      // try (28 -> 41): 42 java/lang/RuntimeException
   }

   protected final <IDPM extends Identity> Collection<Pair<IDPM, IdentityProvider<?, ?, ?, ?>>> findMultipleMembersByDependencies(
      Collection<Dependency> var1, DependentEntityCacheProvider.DependentEntityCache var2, boolean var3
   ) throws FindException {
      ArrayList var4 = new ArrayList();

      for (Dependency var6 : var1) {
         DependentEntity var7 = (DependentEntity)var6.getDependent();
         IdentityProvider var8 = this.findIdpByDependent(var7);

         try {
            if (var8 == null || !this.isInterestedIdp(var8)) {
               continue;
            }
         } catch (FindException var11) {
            throw a(var11);
         }

         Identity var9 = var2.get(var7, () -> this.findMemberByDependent(var7, var8, var3));

         try {
            if (var9 != null) {
               var4.add(Pair.pair(var9, var8));
            }
         } catch (FindException var10) {
            throw a(var10);
         }
      }

      return var4;
   }

   protected final IdentityProvider<?, ?, ?, ?> findIdpByDependent(DependentEntity var1) throws FindException {
      return this.idpHelper.idpByGoid(((IdentityHeader)var1.getEntityHeader()).getProviderGoid());
   }

   protected final Identity findMemberByDependent(DependentEntity var1, IdentityProvider<?, ?, ?, ?> var2, boolean var3) {
      try {
         try {
            if (var3) {
               return this.findUserByDependent(var1, var2);
            }
         } catch (Throwable var5) {
            throw a(var5);
         }

         return this.findGroupByDependent(var1, var2);
      } catch (Throwable var6) {
         throw var6;
      }
   }

   protected final User findUserByDependent(DependentEntity var1, IdentityProvider<?, ?, ?, ?> var2) {
      try {
         return var2.getUserManager().findByPrimaryKey(var1.getEntityHeader().getStrId());
      } catch (Throwable var4) {
         throw var4;
      }
   }

   protected final Group findGroupByDependent(DependentEntity var1, IdentityProvider<?, ?, ?, ?> var2) {
      try {
         return var2.getGroupManager().findByPrimaryKey(var1.getEntityHeader().getStrId());
      } catch (Throwable var4) {
         throw var4;
      }
   }

   protected final List<EO> doFindAll(DataFetchingEnvironment var1) throws FindException {
      return this.findAll().stream().map(this::toEntityDTO).filter(Objects::nonNull).collect(Collectors.toList());
   }

   protected final List<EO> doFindMultiple(DataFetchingEnvironment var1, Predicate<IDPC> var2) throws FindException {
      return this.findAll().stream().filter(var2).map(this::toEntityDTO).filter(Objects::nonNull).collect(Collectors.toList());
   }

   protected final EO doProcessSingle(DataFetchingEnvironment var1, IDPC var2) {
      try {
         if (var2 != null) {
            return this.toEntityDTO((IDPC)var2);
         }
      } catch (RuntimeException var3) {
         throw a(var3);
      }

      return null;
   }

   protected final List<EO> doProcessMultiple(DataFetchingEnvironment var1, Collection<IDPC> var2) {
      return var2.stream().map(this::toEntityDTO).filter(Objects::nonNull).collect(Collectors.toList());
   }

   protected final EO doFindByName(DataFetchingEnvironment var1, String var2) throws FindException {
      IdentityProviderConfig var3 = this.findByName(var2);

      try {
         if (var3 != null) {
            return this.toEntityDTO((IDPC)var3);
         }
      } catch (FindException var4) {
         throw a(var4);
      }

      return null;
   }

   protected final EO doFindByGoid(DataFetchingEnvironment var1, String var2) throws FindException {
      IdentityProviderConfig var3 = this.findByGoid(Goid.parseGoid(var2));

      try {
         if (var3 != null) {
            return this.toEntityDTO((IDPC)var3);
         }
      } catch (FindException var4) {
         throw a(var4);
      }

      return null;
   }

   private static Throwable a(Throwable var0) {
      return var0;
   }

   static {
      String var10002 = c(89, a("\u001f9\u0014\u001e`\u0006c/}\u0001\u0002{\u0019~28\u0003P}\u001c782\u0005P"));
      byte var10001 = -1;
      e = var10002;
   }

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

      return var10000;
   }

   private static String c(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 15;
            case 1 -> 4;
            case 2 -> 40;
            case 3 -> 41;
            case 4 -> 77;
            case 5 -> 54;
            default -> 78;
         });
      }

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