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.l7tech.external.assertions.gatewaygraphql.EntityTypeInfo;
import com.l7tech.external.assertions.gatewaygraphql.server.resolver.meta.GraphQLMetadataUtil;
import com.l7tech.external.assertions.gatewaygraphql.server.util.Util;
import com.l7tech.policy.code.config.I18NResource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Generated;

public class EntityMetadataDTO extends NonEntityDTO {
   private static final String 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;
   private static final String j;
   private static final String k;
   private final EntityTypeInfo l;
   private final Map<String, String> m;
   private final Map<String, List<String>> n;
   private final List<String> o;
   private List<EntityMetadataDTO.EntityFieldMetadata> p;
   private List<EntityMetadataDTO.SubEntityMetadata> q;
   private List<EntityMetadataDTO.EntityMethodMetadata> r;
   private List<EntityMetadataDTO.EntityMethodMetadata> s;
   private static final String[] t;

   public EntityMetadataDTO(EntityTypeInfo var1) {
      this.l = var1;
      this.m = GraphQLMetadataUtil.getEntityTypeAnnotations(this.l);
      this.o = GraphQLMetadataUtil.getEntityPrimaryInputs(this.l);
      this.n = new HashMap<>();
   }

   public String getName() {
      return this.l.getTypeName();
   }

   public String getAltName() {
      return this.l.getAltTypeName();
   }

   public List<String> getTypeNames() {
      return List.of(this.l.getTypeNames());
   }

   public List<String> getQueryTypeNames() {
      return List.of(this.l.getQueryTypeNames());
   }

   public List<String> getBundleSectionNames() {
      return List.of(this.l.getBundleSectionNames());
   }

   public List<String> getDisplayNames() {
      return List.of(this.l.getDisplayNames());
   }

   public String getSingularName() {
      return this.l.getBundleSectionNames()[0];
   }

   public String getPluralName() {
      return this.l.getBundleSectionNames()[1];
   }

   public String getSingularDisplayName() {
      return this.l.getDisplayNames()[0];
   }

   public String getPluralDisplayName() {
      return this.l.getDisplayNames()[1];
   }

   public boolean isDeprecated() {
      return this.m.containsKey(t[18]);
   }

   public int getMutationOrder() {
      return this.l.getMutationOrder();
   }

   public List<String> getNameFields() {
      String[] var2 = t;
      List var1 = a(this.n, this.m, var2[4]);
      return var1.isEmpty() ? List.of(var2[15]) : var1;
   }

   public List<EntityMetadataDTO.EntityFieldMetadata> getFields() {
      if (this.p == null) {
         this.p = GraphQLMetadataUtil.getEntityTypeFields(this.l);
         a(this.p, this.m);
      }

      return this.p;
   }

   public List<EntityMetadataDTO.EntitySubFieldMetadata> getSubFields() {
      return GraphQLMetadataUtil.getEntityTypeSubFields(this.l);
   }

   public List<EntityMetadataDTO.SubEntityMetadata> getSubEntities() {
      if (this.q == null) {
         this.q = GraphQLMetadataUtil.getEntitySubTypes(this.l);
      }

      return this.q;
   }

   public List<String> getIdentityFields() {
      return a(this.n, this.m, t[10]);
   }

   public List<String> getSummaryFields() {
      return a(this.n, this.m, t[1]);
   }

   public List<String> getExcludedFields() {
      return a(this.n, this.m, t[12]);
   }

   public List<String> getDisplaySummaryFields() {
      return a(this.n, this.m, t[14]);
   }

   public List<String> getEncryptedFields() {
      return a(this.n, this.m, t[19]);
   }

   public List<String> getForeignFields() {
      return a(this.n, this.m, t[11]);
   }

   public List<String> getAlternativeFields() {
      return a(this.n, this.m, t[20]);
   }

   public List<EntityMetadataDTO.EntityMethodMetadata> getQueryMethods() {
      this.a();
      return this.r;
   }

   public List<EntityMetadataDTO.EntityMethodMetadata> getMutationMethods() {
      this.b();
      return this.s;
   }

   public List<JsonNode> getConfigSchemas() {
      return GraphQLMetadataUtil.generateSchemas(this.l);
   }

   public List<JsonNode> getUiSchemas() {
      return Collections.emptyList();
   }

   public List<I18NResource> getI18nResources() {
      return Collections.emptyList();
   }

   private void a() {
      if (this.r == null) {
         this.r = GraphQLMetadataUtil.getEntityQueryMethods(this.l, null);
      }
   }

   private void b() {
      if (this.s == null) {
         this.s = GraphQLMetadataUtil.getEntityMutationMethods(this.l, null);
      }
   }

   private static List<String> a(Map<String, List<String>> var0, Map<String, String> var1, String var2) {
      return var0.computeIfAbsent(var2, var1x -> a((String)var1.get(var1x)));
   }

   private static List<String> a(String var0) {
      return a(var0, ",");
   }

   private static List<String> a(String var0, String var1) {
      if (Util.isEmpty(var0)) {
         return Collections.emptyList();
      }

      String[] var2 = var0.split(var1);
      return Arrays.stream(var2).map(String::trim).filter(var0x -> !var0x.isEmpty()).toList();
   }

   @Override
   protected Object createWrapperObject() {
      return new EntityMetadataDTO.EntityMetadataWrapper(this.l);
   }

   private static void a(List<EntityMetadataDTO.EntityFieldMetadata> var0, Map<String, String> var1) {
      String[] var4 = t;
      List var2 = a((String)var1.get(var4[16]));
      if (!var2.isEmpty()) {
         var0.forEach(var1x -> var1x.setForeignFieldUsing(var2));
      }

      List var3 = a((String)var1.get(t[2]));
      if (!var3.isEmpty()) {
         var0.forEach(var1x -> var1x.setAlternativeFieldsUsing(var3));
      }
   }

   @Generated
   public List<String> getPrimaryInputs() {
      return this.o;
   }

   static {
      String[] var5 = new String[21];
      int var3 = 0;
      String var2 = "2cx{9gG\u0002c./p}A\u001fb.$$#R\u001bj#2.\u00122cx{.{Y\u001fn=/ph]\u0017c+%\u00162cx{<b@\u0017}!7)gB\u0017\")?8bP\u0001\u000e2cx{9kD\u0000j,7)kP\u000f2cx{3oY\u0017\")?8bP\u0001\u00142cx{8`W\u0000v?\"8j\u0019\u0014f*:9}\u00132cx{4jQ\u001c{&\"$#R\u001bj#2.\u00132cx{8vW\u001ez+39#R\u001bj#2.\u00122cx{.{Y\u001fn=/ph]\u0017c+%\u000f2cx{8`@\u001b{6{)wD\u0017\u00132cx{4jQ\u001c{&\"$#R\u001bj#2.\u00122cx{;aF\u0017f(8ph]\u0017c+%\u00132cx{8vW\u001ez+39#R\u001bj#2.\n2cx{8`@\u001b{6\u001a2cx{9gG\u0002c./p}A\u001fb.$$#R\u001bj#2.\u0004\u001cn\"3\u00122cx{;aF\u0017f(8ph]\u0017c+%\u000f2cx{3oY\u0017\")?8bP\u0001\u000e2cx{9kD\u0000j,7)kP";
      int var4 = "2cx{9gG\u0002c./p}A\u001fb.$$#R\u001bj#2.\u00122cx{.{Y\u001fn=/ph]\u0017c+%\u00162cx{<b@\u0017}!7)gB\u0017\")?8bP\u0001\u000e2cx{9kD\u0000j,7)kP\u000f2cx{3oY\u0017\")?8bP\u0001\u00142cx{8`W\u0000v?\"8j\u0019\u0014f*:9}\u00132cx{4jQ\u001c{&\"$#R\u001bj#2.\u00132cx{8vW\u001ez+39#R\u001bj#2.\u00122cx{.{Y\u001fn=/ph]\u0017c+%\u000f2cx{8`@\u001b{6{)wD\u0017\u00132cx{4jQ\u001c{&\"$#R\u001bj#2.\u00122cx{;aF\u0017f(8ph]\u0017c+%\u00132cx{8vW\u001ez+39#R\u001bj#2.\n2cx{8`@\u001b{6\u001a2cx{9gG\u0002c./p}A\u001fb.$$#R\u001bj#2.\u0004\u001cn\"3\u00122cx{;aF\u0017f(8ph]\u0017c+%\u000f2cx{3oY\u0017\")?8bP\u0001\u000e2cx{9kD\u0000j,7)kP"
         .length();
      char var1 = 26;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 121;
         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) {
                     t = var5;
                     String[] var9 = t;
                     b = t[9];
                     f = var9[7];
                     a = var9[13];
                     d = var9[6];
                     g = var9[0];
                     k = var9[2];
                     h = var9[17];
                     i = var9[5];
                     j = var9[16];
                     c = var9[3];
                     e = var9[8];
                     return;
                  }

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

                  var2 = "\n[@C\u0000Xo8N\u0007\u001a\u0000R!,^\u0012\u0002\u0001E\u0016\n[@C\u0004Zx/E\u0019\u000f\u0011_z/\u001a\u0011\u0007\u0000Zh9";
                  var4 = "\n[@C\u0000Xo8N\u0007\u001a\u0000R!,^\u0012\u0002\u0001E\u0016\n[@C\u0004Zx/E\u0019\u000f\u0011_z/\u001a\u0011\u0007\u0000Zh9"
                     .length();
                  var1 = 20;
                  var7 = -1;
            }

            var10000 = 65;
            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] ^ 77);
      }

      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 -> 11;
            case 1 -> 118;
            case 2 -> 54;
            case 3 -> 47;
            case 4 -> 36;
            case 5 -> 119;
            default -> 77;
         });
      }

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

   public static class EntityFieldMetadata {
      private final String a;
      private final String b;
      private EntityMetadataDTO.ForeignEntityFieldMetadata c;
      private List<String> d = Collections.emptyList();
      private List<String> e;
      private static final String[] f;

      public void setForeignFieldUsing(List<String> var1) {
         var1.stream().filter(var1x -> var1x.startsWith(var0)).findFirst().ifPresent(var1x -> this.c = this.a(var1x));
      }

      public void setAlternativeFieldsUsing(List<String> var1) {
         String var2 = this.a + "|";
         var1.stream()
            .filter(var1x -> var1x.startsWith(var2))
            .findFirst()
            .ifPresent(var2x -> this.d = EntityMetadataDTO.a(var2x.substring(var2.length()), f[0]));
      }

      private EntityMetadataDTO.ForeignEntityFieldMetadata a(String var1) {
         List var2 = EntityMetadataDTO.a(var1, f[1]);
         return var2.size() > 2 ? new EntityMetadataDTO.ForeignEntityFieldMetadata((String)var2.get(1), (String)var2.get(2)) : null;
      }

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

      @Generated
      public String getGraphQLType() {
         return this.b;
      }

      @Generated
      public EntityMetadataDTO.ForeignEntityFieldMetadata getForeignField() {
         return this.c;
      }

      @Generated
      public List<String> getAlternativeFields() {
         return this.d;
      }

      @Generated
      public List<String> getPermittedValues() {
         return this.e;
      }

      @Generated
      public EntityFieldMetadata(String var1, String var2) {
         this.a = var1;
         this.b = var2;
      }

      @Generated
      public void setPermittedValues(List<String> var1) {
         this.e = var1;
      }

      static {
         String[] var5 = new String[2];
         int var3 = 0;
         String var2 = "pNL\u0003pNL";
         int var4 = "pNL\u0003pNL".length();
         char var1 = 3;
         int var0 = -1;

         while (true) {
            String var10002 = a(108, b(var2.substring(++var0, var0 + var1)));
            byte var10001 = -1;
            var5[var3++] = var10002;
            if ((var0 += var1) >= var4) {
               f = var5;
               return;
            }

            var1 = var2.charAt(var0);
         }
      }

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

         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 -> 71;
               case 1 -> 94;
               case 2 -> 125;
               case 3 -> 40;
               case 4 -> 97;
               case 5 -> 66;
               default -> 20;
            });
         }

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

   public static class EntityInputFieldMetadata {
      private final String a;
      private final String b;

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

      @Generated
      public String getGraphQLType() {
         return this.b;
      }

      @Generated
      public EntityInputFieldMetadata(String var1, String var2) {
         this.a = var1;
         this.b = var2;
      }
   }

   public static class EntityInputMetadata {
      private final String a;
      private final List<EntityMetadataDTO.EntityInputFieldMetadata> b;

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

      @Generated
      public List<EntityMetadataDTO.EntityInputFieldMetadata> getFields() {
         return this.b;
      }

      @Generated
      public EntityInputMetadata(String var1, List<EntityMetadataDTO.EntityInputFieldMetadata> var2) {
         this.a = var1;
         this.b = var2;
      }
   }

   @JsonIncludeProperties(
      {
            "name",
            "singularName",
            "pluralName",
            "fields",
            "subFields",
            "configSchemas",
            "uiSchemas",
            "i18nResources",
            "nameFields",
            "identityFields",
            "excludedFields",
            "summaryFields",
            "displaySummaryFields",
            "encryptedFields",
            "foreignFields",
            "alternativeFields"
      }
   )
   @JsonPropertyOrder(
      {
            "name",
            "singularName",
            "pluralName",
            "fields",
            "subFields",
            "configSchemas",
            "uiSchemas",
            "i18nResources",
            "nameFields",
            "identityFields",
            "excludedFields",
            "summaryFields",
            "displaySummaryFields",
            "encryptedFields",
            "foreignFields",
            "alternativeFields"
      }
   )
   public static class EntityMetadataWrapper extends EntityMetadataDTO {
      public EntityMetadataWrapper(EntityTypeInfo var1) {
         super(var1);
      }

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

   public static class EntityMethodMetadata {
      private final String a;
      private final List<EntityMetadataDTO.EntityInputFieldMetadata> b;
      private final String c;
      private final boolean d;

      public void add(EntityMetadataDTO.EntityInputFieldMetadata var1) {
         this.b.add(var1);
      }

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

      @Generated
      public List<EntityMetadataDTO.EntityInputFieldMetadata> getArguments() {
         return this.b;
      }

      @Generated
      public String getGraphQLType() {
         return this.c;
      }

      @Generated
      public boolean isMutation() {
         return this.d;
      }

      @Generated
      public EntityMethodMetadata(String var1, List<EntityMetadataDTO.EntityInputFieldMetadata> var2, String var3, boolean var4) {
         this.a = var1;
         this.b = var2;
         this.c = var3;
         this.d = var4;
      }
   }

   public static class EntitySubFieldMetadata {
      private final String a;
      private final String b;
      private final String c;

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

      @Generated
      public String getGraphQLType() {
         return this.b;
      }

      @Generated
      public String getEntitySubType() {
         return this.c;
      }

      @Generated
      public EntitySubFieldMetadata(String var1, String var2, String var3) {
         this.a = var1;
         this.b = var2;
         this.c = var3;
      }
   }

   public static class ForeignEntityFieldMetadata {
      private final String a;
      private final String b;

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

      @Generated
      public String getEntityType() {
         return this.b;
      }

      @Generated
      public ForeignEntityFieldMetadata(String var1, String var2) {
         this.a = var1;
         this.b = var2;
      }
   }

   public static class SubEntityMetadata {
      private final String a;
      private final List<EntityMetadataDTO.EntityFieldMetadata> b = new ArrayList<>();
      private final Map<String, String> c;
      private final Map<String, List<String>> d;
      private boolean e;
      private static final String[] f;

      public SubEntityMetadata(String var1, Map<String, String> var2) {
         this.a = var1;
         this.c = var2;
         this.d = new HashMap<>();
      }

      public void addField(EntityMetadataDTO.EntityFieldMetadata var1) {
         this.b.add(var1);
      }

      public List<EntityMetadataDTO.EntityFieldMetadata> getFields() {
         if (!this.e) {
            EntityMetadataDTO.a(this.b, this.c);
            this.e = true;
         }

         return this.b;
      }

      public List<String> getEncryptedFields() {
         return EntityMetadataDTO.a(this.d, this.c, f[1]);
      }

      public List<String> getExcludedFields() {
         return EntityMetadataDTO.a(this.d, this.c, f[0]);
      }

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

      @Generated
      public Map<String, String> getAnnotations() {
         return this.c;
      }

      @Generated
      public Map<String, List<String>> getFieldsStore() {
         return this.d;
      }

      @Generated
      public boolean isFieldsInitialized() {
         return this.e;
      }

      static {
         String[] var5 = new String[2];
         int var3 = 0;
         String var2 = "hsYCLw\fDj\n\u000bM\"\tAz\u0002\nZ\u0014hsYCLa\fZf\u001e\u001aLkBNv\u000b\u0002M|";
         int var4 = "hsYCLw\fDj\n\u000bM\"\tAz\u0002\nZ\u0014hsYCLa\fZf\u001e\u001aLkBNv\u000b\u0002M|".length();
         char var1 = 19;
         int var0 = -1;

         while (true) {
            String var10002 = a(80, a(var2.substring(++var0, var0 + var1)));
            byte var10001 = -1;
            var5[var3++] = var10002;
            if ((var0 += var1) >= var4) {
               f = var5;
               return;
            }

            var1 = var2.charAt(var0);
         }
      }

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

         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 -> 120;
               case 1 -> 79;
               case 2 -> 62;
               case 3 -> 62;
               case 4 -> 121;
               case 5 -> 95;
               default -> 63;
            });
         }

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