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

import com.l7tech.external.assertions.gatewaygraphql.EntityTypeInfo;
import com.l7tech.external.assertions.gatewaygraphql.server.data.BundleEntityRef;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import lombok.Generated;

public class BundleEntityRefResult {
   private final Map<String, Map<String, BundleEntityRef>> a = new HashMap<>();
   private Map<String, Object> b;
   private Map<String, Object> c;
   private boolean d;
   private static final String[] e;

   public void normalize() {
      this.b = new LinkedHashMap<>();
      this.c = new LinkedHashMap<>();
      this.a.forEach((var1, var2) -> {
         ArrayList var3 = new ArrayList();
         ArrayList var4 = new ArrayList();
         var2.values().forEach(var3x -> (var3x.isBroken() ? var4 : var3).add(this.a(var3x)));
         if (!var3.isEmpty()) {
            this.b.put(var1, var3);
         }

         if (!var4.isEmpty()) {
            this.c.put(var1, var4);
         }
      });
   }

   private Map<String, Object> a(BundleEntityRef var1) {
      LinkedHashMap var2 = new LinkedHashMap();
      String[] var3 = e;
      var2.put(var3[2], var1.getGoid());
      var2.put(var3[3], var1.getName());
      var2.put(var3[6], var1.getEntityType());
      if (Util.isNotEmpty(var1.getReferences())) {
         var2.put(var3[1], var1.getReferences().stream().map(this::a).toList());
      }

      return var2;
   }

   public void forEach(BiConsumer<String, Map<String, BundleEntityRef>> var1) {
      this.a.forEach(var1);
   }

   public List<String> getBundleSectionNames() {
      return this.a.keySet().stream().toList();
   }

   public Map<String, BundleEntityRef> getEntityReferences(EntityTypeInfo var1) {
      return this.a.get(var1.getBundleName());
   }

   public Map<String, BundleEntityRef> getOrDefaultEntityReferences(EntityTypeInfo var1) {
      return this.a.getOrDefault(var1.getBundleName(), Collections.emptyMap());
   }

   public Map<String, BundleEntityRef> getOrCreateEntityReferences(EntityTypeInfo var1) {
      return this.a.computeIfAbsent(var1.getBundleName(), var0 -> new HashMap<>());
   }

   public BundleEntityRef addReference(BundleEntityRef var1) {
      return this.a(var1, this.getOrCreateEntityReferences(var1.getTypeInfo()));
   }

   public void addReferences(List<Map<?, ?>> var1, EntityTypeInfo var2, BundleEntityRef var3) {
      Map var4 = this.getOrCreateEntityReferences(var2);
      var1.forEach(var4x -> {
         BundleEntityRef var5 = this.a(var4x, var2);
         if (var5 != null) {
            BundleEntityRef var6 = this.a(var5, var4);
            if (var6 == null) {
               this.b(var5, var4x);
               if (var3 != null) {
                  var3.addReference(this.a(var4x, var2));
               }
            } else {
               this.b(var6, var4x);
               if (var3 != null) {
                  var3.addReference(var5);
               }
            }
         }
      });
   }

   private BundleEntityRef a(BundleEntityRef var1, Map<String, BundleEntityRef> var2) {
      return var2.putIfAbsent(var1.getGoid(), var1);
   }

   private BundleEntityRef a(Map<?, ?> var1, EntityTypeInfo var2) {
      String[] var5 = e;
      Object var3 = var1.get(var5[7]);
      if (var3 != null) {
         Object var4 = var1.get(var5[4]);
         if (var4 == null) {
            var4 = var1.get(var2.getIdentityKey());
         }

         return new BundleEntityRef(String.valueOf(var3), var4 != null ? String.valueOf(var4) : null, var2);
      } else {
         return null;
      }
   }

   private void b(BundleEntityRef var1, Map<?, ?> var2) {
      Map var3 = this.a(var2);
      if (var3 != null) {
         this.d = true;
         var3.forEach((var2x, var3x) -> {
            EntityTypeInfo var4 = EntityTypeInfo.fromVariableBundleName((String)var2x);
            if (var4 != null && var3x instanceof List) {
               this.addReferences((List<Map<?, ?>>)var3x, var4, var1);
            }
         });
      }
   }

   private Map<?, ?> a(Map<?, ?> var1) {
      String[] var6 = e;
      return var1.get(var6[0]) instanceof Map var3 && var3.get(var6[5]) instanceof Map var5 ? var5 : null;
   }

   @Generated
   public Map<String, Object> getReferences() {
      return this.b;
   }

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

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

   static {
      String[] var5 = new String[8];
      int var3 = 0;
      String var2 = "&\u001a\f~;Z\n$\u0010\u0006r*F\u007f5\u0010\u0013\u00041\u001a\ts\u00048\u0014\rr\u00048\u0014\rr\u00122\u001c\u0012r;WU3\u0005\u0005y<F\u007f5\u001c\u0005d";
      int var4 = "&\u001a\f~;Z\n$\u0010\u0006r*F\u007f5\u0010\u0013\u00041\u001a\ts\u00048\u0014\rr\u00048\u0014\rr\u00122\u001c\u0012r;WU3\u0005\u0005y<F\u007f5\u001c\u0005d"
         .length();
      char var1 = 6;
      int var7 = -1;

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

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

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

                  var2 = "aIF,~\b\u0017}WW\u0004cH[!";
                  var4 = "aIF,~\b\u0017}WW\u0004cH[!".length();
                  var1 = '\n';
                  var7 = -1;
            }

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

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

      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 -> 44;
            case 1 -> 15;
            case 2 -> 26;
            case 3 -> 109;
            case 4 -> 34;
            case 5 -> 89;
            default -> 107;
         });
      }

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