package com.l7tech.external.assertions.gatewaygraphql.server.data;

import com.fasterxml.jackson.annotation.JsonIncludeProperties;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.l7tech.external.assertions.gatewaygraphql.server.resolver.helper.PolicyCodeHelper;
import com.l7tech.external.assertions.gatewaygraphql.server.util.JsonUtil;
import com.l7tech.external.assertions.gatewaygraphql.server.util.Util;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.AssertionMetadata;
import com.l7tech.policy.assertion.IdentityTagable;
import com.l7tech.policy.assertion.IdentityTargetable;
import com.l7tech.policy.assertion.MessageTargetable;
import com.l7tech.policy.assertion.PrivateKeyable;
import com.l7tech.policy.assertion.RequestIdentityTargetable;
import com.l7tech.policy.assertion.RoutingAssertion;
import com.l7tech.policy.assertion.XpathBasedAssertion;
import com.l7tech.policy.assertion.annotation.RequiresSOAP;
import com.l7tech.policy.assertion.annotation.RequiresXML;
import com.l7tech.policy.assertion.composite.CompositeAssertion;
import com.l7tech.policy.assertion.credential.wss.WssCredentialSourceAssertion;
import com.l7tech.policy.assertion.xmlsec.RequireSaml;
import com.l7tech.policy.assertion.xmlsec.SecurityHeaderAddressable;
import com.l7tech.policy.assertion.xmlsec.XmlSecurityAssertionBase;
import com.l7tech.policy.code.PolicyCodeModuleProvider;
import com.l7tech.policy.code.config.AssertionCategory;
import com.l7tech.policy.code.config.AssertionTypeConfig;
import com.l7tech.policy.code.config.I18NResource;
import com.l7tech.policy.code.config.JsonResourcePatch;
import com.l7tech.policy.code.config.PolicyCodeConfig;
import com.l7tech.policy.code.config.AssertionCodeConfig.AssertionDisplayNameFormat;
import com.l7tech.policy.code.config.AssertionCodeConfig.AssertionRefEntity;
import com.l7tech.policy.code.config.AssertionCodeConfig.AssertionRefVariable;
import com.l7tech.util.ExceptionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringUtils;

public class AssertionMetadataDTO extends NonEntityDTO {
   private static final Logger a;
   private static final String b;
   private static final String c;
   private static final String d;
   private static final String e;
   private static final String f;
   private static final String g;
   private static final String h;
   private static final String i;
   protected final Assertion assertion;
   protected final PolicyCodeModuleProvider policyCodeModuleProvider;
   protected final PolicyCodeHelper policyCodeHelper;
   protected final AssertionMetadata metadata;
   protected final PolicyCodeConfig policyCodeConfig;
   protected final AssertionTypeConfig atConfig;
   private static final String[] j;

   public AssertionMetadataDTO(Assertion var1, PolicyCodeModuleProvider var2, PolicyCodeHelper var3) {
      this.assertion = var1;
      this.policyCodeModuleProvider = var2;
      this.policyCodeHelper = var3;
      this.metadata = var1.meta();
      this.policyCodeConfig = var2.getCodeConfig();
      this.atConfig = this.policyCodeConfig.getTypeConfigByExtName(this.getConfigNameInternal());
   }

   public String getName() {
      String[] var2 = j;
      String var1 = (String)this.metadata.get(var2[18]);
      return StringUtils.isNotEmpty(var1) ? var1 : (String)this.metadata.get(j[8]);
   }

   public String getConfigName() {
      return this.getConfigNameInternal();
   }

   public String getClassName() {
      return this.assertion.getClass().getName();
   }

   public AssertionMetadataDTO.AssertionType getAssertionType() {
      return isModularAssertion(this.assertion) ? AssertionMetadataDTO.AssertionType.MODULAR : AssertionMetadataDTO.AssertionType.CORE;
   }

   public List<AssertionDisplayNameFormat> getDisplayNameFormats() {
      List var1 = (List)this.metadata.get(j[20]);
      return Util.isNotEmpty(var1) ? var1 : this.atConfig.getCodeConfig().getDisplayNameFormats();
   }

   public String getDescription() {
      String[] var2 = j;
      String var1 = (String)this.metadata.get(var2[1]);
      return StringUtils.isNotEmpty(var1) ? var1 : (String)this.metadata.get(j[24]);
   }

   public boolean isComposite() {
      return this.assertion instanceof CompositeAssertion;
   }

   public List<String> getAnnotations() {
      return Arrays.stream(this.assertion.getClass().getAnnotations()).map(var0 -> var0.annotationType().getSimpleName()).toList();
   }

   public boolean isRouting() {
      return this.assertion instanceof RoutingAssertion;
   }

   public boolean isNeedsInitializedRequest() {
      return this.isRouting() && ((RoutingAssertion)this.assertion).needsInitializedRequest();
   }

   public boolean isInitializesRequest() {
      return this.isRouting() && ((RoutingAssertion)this.assertion).initializesRequest();
   }

   public boolean isNeedsInitializedResponse() {
      return this.isRouting() && ((RoutingAssertion)this.assertion).needsInitializedResponse();
   }

   public boolean isInitializesResponse() {
      return this.isRouting() && ((RoutingAssertion)this.assertion).initializesResponse();
   }

   public boolean isMessageTargetable() {
      return this.assertion instanceof MessageTargetable;
   }

   public boolean isMessageTargetSubjectedToChange() {
      return this.isMessageTargetable() && ((MessageTargetable)this.assertion).isTargetModifiedByGateway();
   }

   public boolean isSecurityHeaderAddressable() {
      return this.assertion instanceof SecurityHeaderAddressable;
   }

   public boolean isIdentityTagable() {
      return this.assertion instanceof IdentityTagable;
   }

   public boolean isIdentityTargetable() {
      return this.assertion instanceof IdentityTargetable;
   }

   public boolean isRequestIdentityTargetable() {
      return this.assertion instanceof RequestIdentityTargetable;
   }

   public boolean isPrivateKeyable() {
      return this.assertion instanceof PrivateKeyable;
   }

   public boolean isSaml() {
      return this.assertion instanceof RequireSaml;
   }

   public boolean isXml() {
      return this.assertion instanceof XmlSecurityAssertionBase
         || this.assertion instanceof XpathBasedAssertion
         || this.assertion.getClass().getAnnotation(RequiresXML.class) != null
         || this.assertion.getClass().getAnnotation(RequiresSOAP.class) != null;
   }

   public boolean isSoap() {
      return this.assertion instanceof XmlSecurityAssertionBase
         || this.assertion instanceof WssCredentialSourceAssertion
         || this.assertion.getClass().getAnnotation(RequiresSOAP.class) != null;
   }

   public boolean isWss() {
      if (!(this.assertion instanceof XmlSecurityAssertionBase) && !(this.assertion instanceof WssCredentialSourceAssertion)) {
         RequiresSOAP var1 = this.assertion.getClass().getAnnotation(RequiresSOAP.class);
         return var1 != null && var1.wss();
      } else {
         return true;
      }
   }

   public List<AssertionCategory> getCategories() {
      String[] var2 = j;
      String[] var1 = (String[])this.metadata.get(var2[15]);
      if (var1 == null || var1.length == 0) {
         var1 = (String[])this.metadata.get(j[11]);
      }

      return var1 != null ? Arrays.stream(var1).<AssertionCategory>map(AssertionCategory::fromId).filter(Objects::nonNull).toList() : Collections.emptyList();
   }

   public List<JsonNode> getConfigSchemas() {
      List var1 = this.a((List<String>)this.metadata.get(j[3]), this.atConfig.getCodeConfig().getConfigSchemas());
      if (Util.isEmpty(var1)) {
         var1 = this.policyCodeConfig.getJsonSchemaGenerator().generateAssertionSchemas(this.atConfig);
         this.atConfig.getCodeConfig().setConfigSchemas(var1);
      }

      return var1;
   }

   public List<JsonResourcePatch> getConfigSchemaPatches() {
      List var1 = (List)this.metadata.get(j[4]);
      if (var1 == null) {
         var1 = this.atConfig.getCodeConfig().getConfigSchemaPatches();
      }

      return var1;
   }

   public List<JsonResourcePatch> getConfigDataPatches() {
      List var1 = (List)this.metadata.get(j[9]);
      if (var1 == null) {
         var1 = this.atConfig.getCodeConfig().getConfigDataPatches();
      }

      return var1;
   }

   public List<JsonNode> getUiSchemas() {
      return this.a((List<String>)this.metadata.get(j[26]), this.atConfig.getCodeConfig().getUiSchemas());
   }

   public List<I18NResource> getI18nResources() {
      List var1 = (List)this.metadata.get(j[23]);
      return Util.isNotEmpty(var1) ? var1 : this.atConfig.getCodeConfig().getI18nResources();
   }

   public List<AssertionRefEntity> getRefEntities() {
      List var1 = (List)this.metadata.get(j[7]);
      return Util.isNotEmpty(var1) ? var1 : this.atConfig.getCodeConfig().getRefEntities();
   }

   public List<AssertionRefVariable> getRefVariables() {
      List var1 = (List)this.metadata.get(j[10]);
      return Util.isNotEmpty(var1) ? var1 : this.atConfig.getCodeConfig().getRefVariables();
   }

   public JsonNode getPrototype() {
      try {
         return this.policyCodeHelper.getPolicyCodeAsJsonNode(this.assertion, 3);
      } catch (Exception var2) {
         return null;
      }
   }

   private List<JsonNode> a(List<String> var1, List<JsonNode> var2) {
      try {
         if (var1 != null) {
            ArrayList var3 = new ArrayList();

            for (String var5 : var1) {
               var3.add(JsonUtil.DEFAULT.jsonToJava(var5, JsonNode.class));
            }

            return var3;
         }
      } catch (Exception var6) {
         a.log(Level.WARNING, j[19], new Object[]{ExceptionUtils.getMessageWithCause(var6), var1});
      }

      return var2;
   }

   protected String getConfigNameInternal() {
      return (String)this.metadata.get(j[21]);
   }

   @Override
   protected Object createWrapperObject() {
      return new AssertionMetadataDTO.AssertionMetadataWrapper(this.assertion, this.policyCodeModuleProvider, this.policyCodeHelper);
   }

   protected void adjustSchemaObject(List<JsonNode> var1, Predicate<JsonNode> var2, Consumer<ObjectNode> var3) {
      var1.stream().filter(var2).findFirst().map(var0 -> (ObjectNode)var0).ifPresent(var1x -> {
         if (var3 != null) {
            var3.accept(var1x);
         }
      });
   }

   protected void adjustSchemaObject(List<JsonNode> var1, String var2, String var3, Consumer<ObjectNode> var4) {
      this.adjustSchemaObject(var1, var1x -> var2.equals(var1x.get(j[25]).asText()), var2x -> {
         var2x.put(j[2], var3);
         if (var4 != null) {
            var4.accept(var2x);
         }
      });
   }

   public static boolean isModularAssertion(Assertion var0) {
      ClassLoader var1 = var0.getClass().getClassLoader();
      return var1 != null && var1.getClass().getName().startsWith(j[5]);
   }

   static {
      String[] var5 = new String[27];
      int var3 = 0;
      String var2 = "\u0019gL\r3ds\u001b|C;;wT\u0012mQ\u0013\bmQ\u00046uR\u001eLG\u00189q^\n|K\u00044\u0003^aF\r\u0019gL\r3dd\u0019`G\u0006;p\u0013\u0019gL\r3dd\u0019`G\u0006;SV\u000ekJ\u000e)\u0012\u0019gOE64C\u001fkJE)fE\fmPE\u0013\u0019gL\r3dd\u0019`G\u0006;SV\u000ekJ\u000e)\u000b\bmD.4w^\u000eaG\u0018\u000f\niN\u000e.wR4gF\u000e\u0014bZ\u001f\u0011\u0019gL\r3ds\u001b|C;;wT\u0012mQ\f\bmD=;q^\u001bjN\u000e)\u0017\tmA\u00044gV\bqr\n6fC\u000emd\u00046gR\b{\t\u000faq\b2fZ\u001b{\u0012\u001eaQ\u001b6bN4iO\u000e\u001clE\u0017iV\u0018\r\u00139\u001a\u0005\bfD\u0015}P\b?p\u000e\niN\u000e.wR<gN\u000f?qD\f\bmD=;q^\u001bjN\u000e)\u000b\bmD.4w^\u000eaG\u0018\u0017\bmQ\u00046uR\u001eXC\u0007?wC\u001fFM\u000f?MV\u0017m-<iK\u0007?g\u0017\u000eg\u0002\u001b;qD\u001f(Q\b2fZ\u001b$\u0002\b;vD\u001f5Y['/\u0017\tkJ\u000e7b\n\u00019_\u0012\u001eaQ\u001b6bN4iO\u000e\u001clE\u0017iV\u0018\u000f\r{R.\"wR\bfC\u0007\u0014bZ\u001f\r\u0019gL\r3dd\u0019`G\u0006;p\r\u00139\u001a\u0005\bfD\u0015}P\b?p\u000b\u001emQ\b(jG\u000eaM\u0005";
      int var4 = "\u0019gL\r3ds\u001b|C;;wT\u0012mQ\u0013\bmQ\u00046uR\u001eLG\u00189q^\n|K\u00044\u0003^aF\r\u0019gL\r3dd\u0019`G\u0006;p\u0013\u0019gL\r3dd\u0019`G\u0006;SV\u000ekJ\u000e)\u0012\u0019gOE64C\u001fkJE)fE\fmPE\u0013\u0019gL\r3dd\u0019`G\u0006;SV\u000ekJ\u000e)\u000b\bmD.4w^\u000eaG\u0018\u000f\niN\u000e.wR4gF\u000e\u0014bZ\u001f\u0011\u0019gL\r3ds\u001b|C;;wT\u0012mQ\f\bmD=;q^\u001bjN\u000e)\u0017\tmA\u00044gV\bqr\n6fC\u000emd\u00046gR\b{\t\u000faq\b2fZ\u001b{\u0012\u001eaQ\u001b6bN4iO\u000e\u001clE\u0017iV\u0018\r\u00139\u001a\u0005\bfD\u0015}P\b?p\u000e\niN\u000e.wR<gN\u000f?qD\f\bmD=;q^\u001bjN\u000e)\u000b\bmD.4w^\u000eaG\u0018\u0017\bmQ\u00046uR\u001eXC\u0007?wC\u001fFM\u000f?MV\u0017m-<iK\u0007?g\u0017\u000eg\u0002\u001b;qD\u001f(Q\b2fZ\u001b$\u0002\b;vD\u001f5Y['/\u0017\tkJ\u000e7b\n\u00019_\u0012\u001eaQ\u001b6bN4iO\u000e\u001clE\u0017iV\u0018\u000f\r{R.\"wR\bfC\u0007\u0014bZ\u001f\r\u0019gL\r3dd\u0019`G\u0006;p\r\u00139\u001a\u0005\bfD\u0015}P\b?p\u000b\u001emQ\b(jG\u000eaM\u0005"
         .length();
      char var1 = 17;
      int var7 = -1;

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

         while (true) {
            String var8 = a(var10000, b(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     j = var5;
                     String[] var9 = j;
                     h = j[16];
                     c = var9[22];
                     e = var9[0];
                     i = var9[17];
                     d = var9[6];
                     g = var9[14];
                     b = var9[13];
                     f = var9[12];
                     a = Logger.getLogger(AssertionMetadataDTO.class.getName());
                     return;
                  }

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

                  var2 = "Gx_\t\u0016xh\u0011+\u007fC\u0002b";
                  var4 = "Gx_\t\u0016xh\u0011+\u007fC\u0002b".length();
                  var1 = 3;
                  var7 = -1;
            }

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

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

      return var10000;
   }

   private static String a(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 -> 125;
            case 2 -> 87;
            case 3 -> 30;
            case 4 -> 47;
            case 5 -> 118;
            default -> 66;
         });
      }

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

   @JsonIncludeProperties(
      {
            "name",
            "configName",
            "description",
            "displayNameFormats",
            "categories",
            "composite",
            "routing",
            "messageTargetable",
            "messageTargetSubjectedToChange",
            "securityHeaderAddressable",
            "identityTagable",
            "identityTargetable",
            "privateKeyable",
            "saml",
            "xml",
            "soap",
            "wss",
            "refVariables",
            "refEntities",
            "configSchemas",
            "uiSchemas",
            "i18nResources",
            "configSchemaPatches",
            "configDataPatches",
            "prototype"
      }
   )
   @JsonPropertyOrder(
      {
            "name",
            "configName",
            "description",
            "displayNameFormats",
            "categories",
            "composite",
            "routing",
            "messageTargetable",
            "messageTargetSubjectedToChange",
            "securityHeaderAddressable",
            "identityTagable",
            "identityTargetable",
            "privateKeyable",
            "saml",
            "xml",
            "soap",
            "wss",
            "refVariables",
            "refEntities",
            "configSchemas",
            "uiSchemas",
            "i18nResources",
            "configSchemaPatches",
            "configDataPatches",
            "prototype"
      }
   )
   public static class AssertionMetadataWrapper extends AssertionMetadataDTO {
      public AssertionMetadataWrapper(Assertion var1, PolicyCodeModuleProvider var2, PolicyCodeHelper var3) {
         super(var1, var2, var3);
      }

      @Override
      protected Object createWrapperObject() {
         return null;
      }
   }

   public enum AssertionType {
      CORE,
      MODULAR,
      CUSTOM,
      ENCAPSULATED,
      NATIVE;

      // $VF: Failed to inline enum fields
      // 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!)
      static {
         String[] var0 = new String[5];
         int var4 = 0;
         String var3 = "mGw4\u0010\u0007FdH`0\u0004\u0006fH`<\u0016\u0011\u0004kFf0";
         int var5 = "mGw4\u0010\u0007FdH`0\u0004\u0006fH`<\u0016\u0011\u0004kFf0".length();
         char var2 = '\f';
         int var7 = -1;

         label25:
         while (true) {
            byte var10000 = 107;
            String var10001 = var3.substring(++var7, var7 + var2);
            byte var10002 = -1;

            while (true) {
               String var8 = a(var10000, a(var10001));
               switch (var10002) {
                  case 0:
                     var0[var4++] = var8;
                     if ((var7 += var2) >= var5) {
                        CORE = new AssertionMetadataDTO.AssertionType();
                        MODULAR = new AssertionMetadataDTO.AssertionType();
                        CUSTOM = new AssertionMetadataDTO.AssertionType();
                        ENCAPSULATED = new AssertionMetadataDTO.AssertionType();
                        NATIVE = new AssertionMetadataDTO.AssertionType();
                        return;
                     }

                     var2 = var3.charAt(var7);
                     break;
                  default:
                     var0[var4++] = var8;
                     if ((var7 += var2) < var5) {
                        var2 = var3.charAt(var7);
                        continue label25;
                     }

                     var3 = "\r:\u0001Gi\u007f\u0007\u0003 \u0016Fjs'";
                     var5 = "\r:\u0001Gi\u007f\u0007\u0003 \u0016Fjs'".length();
                     var2 = 6;
                     var7 = -1;
               }

               var10000 = 13;
               var10001 = var3.substring(++var7, var7 + var2);
               var10002 = 0;
            }
         }
      }

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

         return var10000;
      }

      private static String a(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 -> 67;
               case 1 -> 98;
               case 2 -> 95;
               case 3 -> 30;
               case 4 -> 43;
               case 5 -> 63;
               default -> 120;
            });
         }

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