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

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.objectmodel.encass.EncapsulatedAssertionArgumentDescriptor;
import com.l7tech.objectmodel.encass.EncapsulatedAssertionConfig;
import com.l7tech.objectmodel.encass.EncapsulatedAssertionResultDescriptor;
import com.l7tech.policy.assertion.EncapsulatedAssertion;
import com.l7tech.policy.code.PolicyCodeModuleProvider;
import com.l7tech.policy.code.config.AssertionCategory;
import com.l7tech.policy.code.config.AssertionCodeConfig.AssertionRefVariable;
import com.l7tech.policy.code.config.AssertionCodeConfig.AssertionRefVariableType;
import com.l7tech.policy.code.config.schema.JsonSchemaGenerator;
import com.l7tech.policy.variable.DataType;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class EncapsulatedAssertionMetadataDTO extends AssertionMetadataDTO {
   private static final String[] k;

   public EncapsulatedAssertionMetadataDTO(EncapsulatedAssertion var1, PolicyCodeModuleProvider var2, PolicyCodeHelper var3) {
      super(var1, var2, var3);
   }

   @Override
   public String getName() {
      return this.a().getName();
   }

   @Override
   public String getConfigName() {
      return EncapsulatedAssertion.EXTERNAL_NAME_PREFIX + this.a().getName();
   }

   @Override
   public AssertionMetadataDTO.AssertionType getAssertionType() {
      return AssertionMetadataDTO.AssertionType.ENCAPSULATED;
   }

   @Override
   public String getDescription() {
      String var1 = this.a().getProperty(EncapsulatedAssertionConfig.PROP_DESCRIPTION);
      return var1 == null ? "" : var1;
   }

   @Override
   public List<AssertionCategory> getCategories() {
      AssertionCategory var1 = AssertionCategory.fromId(this.a().getProperty(EncapsulatedAssertionConfig.PROP_PALETTE_FOLDER));
      return var1 != null ? List.of(var1) : Collections.emptyList();
   }

   @Override
   public List<JsonNode> getConfigSchemas() {
      String var1 = this.a().getName();
      String var2 = this.policyCodeConfig.getJsonSchemaGenerator().getAssertionSchemaId(this.atConfig);
      String var3 = var2 + ":" + URLEncoder.encode(var1, StandardCharsets.UTF_8);
      String[] var7 = k;
      String var4 = var3 + var7[7];
      ArrayList var5 = new ArrayList();
      super.getConfigSchemas().forEach(var1x -> var5.add(var1x.deepCopy()));
      var5.add(this.a(var4));
      ObjectNode var6 = ((JsonNode)var5.getFirst()).get(var7[5]).withObject(var7[9]);
      var6.put(var7[4], var4);
      var6.remove(var7[6]);
      var6.remove(var7[2]);
      this.adjustSchemaObject(var5, var2, var3, var1x -> var1x.put(k[1], var1));
      this.adjustSchemaObject(var5, var2 + JsonSchemaGenerator.MAIN_SCHEMA_SUFFIX, var3 + JsonSchemaGenerator.MAIN_SCHEMA_SUFFIX, var2x -> {
         String[] var4x = k;
         var2x.put(var4x[10], var1);
         JsonNode var3x = var2x.get(var4x[3]).get(EncapsulatedAssertion.EXTERNAL_NAME);
         if (var3x != null) {
            ((ObjectNode)var3x).put(var4x[8], var3);
         }
      });
      return var5;
   }

   @Override
   public List<AssertionRefVariable> getRefVariables() {
      ArrayList var1 = new ArrayList();
      this.a().getArgumentDescriptors().stream().filter(var0 -> !var0.isGuiPrompt()).forEach(var2 -> var1.add(this.a(var2)));
      this.a().getResultDescriptors().forEach(var2 -> var1.add(this.a(var2)));
      return var1;
   }

   private AssertionRefVariable a(EncapsulatedAssertionArgumentDescriptor var1) {
      AssertionRefVariable var2 = new AssertionRefVariable();
      var2.setFieldPath(k[0] + var1.getArgumentName());
      var2.setRefType(AssertionRefVariableType.IN);
      var2.setDataType(var1.getArgumentType() != null ? var1.getArgumentType() : DataType.UNKNOWN.getShortName());
      return var2;
   }

   private AssertionRefVariable a(EncapsulatedAssertionResultDescriptor var1) {
      AssertionRefVariable var2 = new AssertionRefVariable();
      var2.setFieldPath(".");
      var2.setSuffix(var1.getResultName());
      var2.setRefType(AssertionRefVariableType.OUT);
      var2.setDataType(var1.getResultType());
      var2.setSettable(true);
      return var2;
   }

   private JsonNode a(String var1) {
      return this.policyCodeConfig
         .getJsonSchemaGenerator()
         .generateSchema(
            var1, this.a().getArgumentDescriptors().stream().sorted(Comparator.comparingInt(EncapsulatedAssertionArgumentDescriptor::getOrdinal)).toList()
         );
   }

   private EncapsulatedAssertionConfig a() {
      return ((EncapsulatedAssertion)this.assertion).config();
   }

   static {
      String[] var5 = new String[11];
      int var3 = 0;
      String var2 = "\r\u001dhA\u0019*)W\b{@V\u0005W\u0004}_\u001d\u0011S\f}G\u001d5\"s\u001ffC\u001d58J\bz\nS\u001ffC\u001d58J\bz\u0004\u0007\u001flU\nS\u001ffC\u001d58J\bz\u0004W\u0014yV\u000b\f=hA\u0019*)W\b{@\u0004\u0007\u001flU";
      int var4 = "\r\u001dhA\u0019*)W\b{@V\u0005W\u0004}_\u001d\u0011S\f}G\u001d5\"s\u001ffC\u001d58J\bz\nS\u001ffC\u001d58J\bz\u0004\u0007\u001flU\nS\u001ffC\u001d58J\bz\u0004W\u0014yV\u000b\f=hA\u0019*)W\b{@\u0004\u0007\u001flU"
         .length();
      char var1 = '\f';
      int var7 = -1;

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

         while (true) {
            String var8 = b(var10000, c(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     k = var5;
                     return;
                  }

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

                  var2 = "W\b\u007fV\u0011&<B\u001b~\u0005S\u0000y[\u0019";
                  var4 = "W\b\u007fV\u0011&<B\u001b~\u0005S\u0000y[\u0019".length();
                  var1 = '\n';
                  var7 = -1;
            }

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

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

      return var10000;
   }

   private static String b(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 -> 55;
            case 1 -> 121;
            case 2 -> 29;
            case 3 -> 39;
            case 4 -> 108;
            case 5 -> 83;
            default -> 88;
         });
      }

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