package com.l7tech.policy.code.config;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.l7tech.policy.AssertionRegistry;
import com.l7tech.policy.CustomAssertionRegistry;
import com.l7tech.policy.code.transformer.Base64EncodedStringFieldTransformer;
import com.l7tech.policy.code.transformer.BeanTypeCategory;
import com.l7tech.util.Config;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.SyspropUtil;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.BiPredicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class PolicyCodeConfigBuilder {
   private static final Logger a;
   public static final String GLOBAL_POLICY_CODE_CONFIG_RESOURCE;
   public static final String META_BOOTSTRAP_FOLDER_PATH;
   public static final String ASSERTION_CODE_CONFIG_EXTENSION;
   public static final String OVERWRITE_POLICY_CODE_CONFIG_PROPERTY;
   private final ObjectMapper b;
   private Config c;
   private AssertionRegistry d;
   private CustomAssertionRegistry e;
   private static final String[] f;

   public PolicyCodeConfigBuilder() {
      this(new ObjectMapper());
   }

   public PolicyCodeConfigBuilder(ObjectMapper var1) {
      this.b = var1;
   }

   public static PolicyCodeConfigBuilder getBuilder() {
      return new PolicyCodeConfigBuilder();
   }

   public PolicyCodeConfigBuilder assertionRegistry(AssertionRegistry var1) {
      this.d = var1;
      return this;
   }

   public PolicyCodeConfigBuilder customAssertionRegistry(CustomAssertionRegistry var1) {
      this.e = var1;
      return this;
   }

   public PolicyCodeConfigBuilder serverConfig(Config var1) {
      this.c = var1;
      return this;
   }

   public PolicyCodeConfig build() {
      AssertionAwarePolicyCodeConfig var1 = new AssertionAwarePolicyCodeConfig(this.d, this.e, this.c);
      this.a(var1);

      try (ExecutorService var2 = Executors.newSingleThreadExecutor()) {
         var2.submit(() -> this.b(var1));
      }

      var1.configureListeners();
      return var1;
   }

   private void a(AssertionAwarePolicyCodeConfig var1) {
      try {
         String[] var4 = f;
         ObjectNode var2 = (ObjectNode)this.a(var4[15]);
         if (var2 != null) {
            AssertionSubTypeConfig var3 = new AssertionSubTypeConfig(Base64EncodedStringFieldTransformer.class, BeanTypeCategory.BASE64_ENCODED_STRING);
            var1.add(var3);
            this.a(var2, var4[6], BeanTypeCategory.WSP_ENUM).forEach(var1::add);
            this.a(var2, var4[9], BeanTypeCategory.BASIC_OBJECT_STRING).forEach(var1::add);
            this.a(var2, var4[13], BeanTypeCategory.BASIC_OBJECT_VALUE).forEach(var1::add);
            this.a(var2, var4[24], BeanTypeCategory.ABSTRACT).forEach(var1::add);
            this.a(var2, var4[12], BeanTypeCategory.BEAN).forEach(var1::add);
            this.a(var2, var1).forEach(var1::update);
         }
      } catch (Exception var5) {
         a.log(Level.WARNING, f[4], ExceptionUtils.getMessageWithCause(var5));
      }
   }

   private void b(AssertionAwarePolicyCodeConfig var1) {
      ObjectReader var2 = this.b.readerFor(AssertionCodeConfig.class);
      if (SyspropUtil.getBoolean(f[26], false)) {
         this.a(var1, var2);
         this.b(var1, var2);
      } else {
         this.b(var1, var2);
         this.a(var1, var2);
      }
   }

   private void a(AssertionAwarePolicyCodeConfig var1, ObjectReader var2) {
      for (AssertionCategory var6 : AssertionCategory.values()) {
         try {
            String var10001 = var6.name();
            String[] var8 = f;
            JsonNode var7 = this.a(var10001 + var8[23]);

            try {
               if (var7 != null) {
                  this.a(var1, var2, var7, var8[7] + var6.name());
               }
            } catch (Exception var9) {
               throw a(var9);
            }
         } catch (Exception var10) {
            a.log(Level.WARNING, f[28], new Object[]{var6.name(), ExceptionUtils.getMessageWithCause(var10)});
         }
      }
   }

   private void b(AssertionAwarePolicyCodeConfig var1, ObjectReader var2) {
      Path var3 = Path.of(META_BOOTSTRAP_FOLDER_PATH);
      BiPredicate var4 = (var0, var1x) -> var1x.isRegularFile() && var0.toString().endsWith(f[10]);
      if (Files.exists(var3)) {
         try {
            Stream var5 = Files.find(var3, Integer.MAX_VALUE, var4).sorted();

            try {
               for (Path var7 : var5.toList()) {
                  try {
                     JsonNode var8 = this.b.readTree(var7.toFile());

                     try {
                        if (var8 != null) {
                           this.a(var1, var2, var8, f[22] + var7.toFile());
                        }
                     } catch (Exception var12) {
                        throw a(var12);
                     }
                  } catch (Exception var13) {
                     String[] var9 = f;
                     a.log(Level.WARNING, var9[1], new Object[]{var7.toFile(), ExceptionUtils.getMessageWithCause(var13)});
                  }
               }
            } catch (Throwable var14) {
               if (var5 != null) {
                  try {
                     var5.close();
                  } catch (Throwable var10) {
                     var14.addSuppressed(var10);
                  }
               }

               throw var14;
            }

            try {
               if (var5 != null) {
                  var5.close();
               }
            } catch (Exception var11) {
               throw a(var11);
            }
         } catch (Exception var15) {
            a.log(Level.WARNING, f[11], ExceptionUtils.getMessageWithCause(var15));
         }
      }
   }

   private void a(AssertionAwarePolicyCodeConfig var1, ObjectReader var2, JsonNode var3, String var4) throws IOException {
      if (var3.isArray()) {
         String[] var6 = f;
         a.log(Level.INFO, var6[17], var4);
         int var5 = 0;

         try {
            while (var5 < var3.size()) {
               var1.add((AssertionCodeConfig)var2.readValue(var3.get(var5)));
               var5++;
            }
         } catch (IOException var8) {
            throw a(var8);
         }
      } else {
         try {
            if (var3.isObject()) {
               a.log(Level.INFO, f[14], var4);
               var1.add((AssertionCodeConfig)var2.readValue(var3));
            }
         } catch (IOException var7) {
            throw a(var7);
         }
      }
   }

   private JsonNode a(String var1) throws IOException {
      URL var2 = this.getClass().getResource(var1);

      try {
         if (var2 != null) {
            return (JsonNode)this.b.readValue(var2, JsonNode.class);
         }
      } catch (IOException var3) {
         throw a(var3);
      }

      return null;
   }

   private List<AssertionBeanTypeConfig> a(ObjectNode var1, PolicyCodeConfig var2) {
      ArrayList var3 = new ArrayList();
      var1.withArray(f[8]).forEach(var2x -> {
         String[] var3x = f;
         var3.add(a(var2x.get(var3x[20]).asText(), var2x.get(var3x[0]).asText(), var2x, var2));
      });
      return var3;
   }

   private List<AssertionSubTypeConfig> a(ObjectNode var1, String var2, BeanTypeCategory var3) {
      ArrayList var4 = new ArrayList();
      var1.withArray(var2).forEach(var3x -> {
         try {
            String var4x = var3x.asText();
            int var5 = var4x.indexOf(124);

            List var10000;
            AssertionSubTypeConfig var10001;
            AssertionSubTypeConfig var10002;
            String var10003;
            label26: {
               try {
                  var10000 = var4;
                  var10001 = new AssertionSubTypeConfig;
                  var10002 = var10001;
                  if (var5 != -1) {
                     var10003 = var4x.substring(0, var5);
                     break label26;
                  }
               } catch (Exception var6) {
                  throw a(var6);
               }

               var10003 = var4x;
            }

            var10002./* $VF: Unable to resugar constructor */<init>(Class.forName(var10003), var3, var5 != -1 ? var4x.substring(var5 + 1) : null);
            var10000.add(var10001);
         } catch (Exception var7) {
            a.log(Level.WARNING, f[5], new Object[]{var2, var3x.asText(), ExceptionUtils.getMessageWithCause(var7)});
         }
      });
      return var4;
   }

   private static AssertionBeanTypeConfig a(String var0, String var1, JsonNode var2, PolicyCodeConfig var3) {
      String[] var11 = f;
      Map var4 = a(a(var2.get(var11[18])));
      Map var5 = a(a(var2.get(var11[25])));
      List var6 = a(var2.get(var11[2]));
      String var7 = var2.has(var11[27]) ? var2.get(var11[16]).asText() : null;
      ArrayList var8 = new ArrayList();
      var4.forEach((var4x, var5x) -> {
         FieldTypeConfig var6x = new FieldTypeConfig(var4x, var5x);
         String var7x = (String)var5.get(var4x);
         if (var7x != null) {
            var6x.setSubTypeConfig(var3.getSubTypeConfigByExtNameSilently(var7x));
         }

         var6x.setIgnored(var6.contains(var4x));
         var8.add(var6x);
      });
      AssertionBeanTypeConfig var9 = new AssertionBeanTypeConfig(var0, var8);
      String[] var10 = var1.split("=");
      var9.setRegistryName(var10[0]);
      var9.setExternalName(var10.length > 1 ? var10[1] : var10[0]);
      var9.setDefaultField(var7);
      return var9;
   }

   private static List<String> a(JsonNode var0) {
      if (var0 != null && var0.isArray()) {
         ArrayList var1 = new ArrayList();

         for (int var2 = 0; var2 < var0.size(); var2++) {
            JsonNode var3 = var0.get(var2);
            if (var3 != null) {
               var1.add(var3.textValue());
            }
         }

         return var1;
      } else {
         return Collections.emptyList();
      }
   }

   private static Map<String, String> a(List<String> var0) {
      return var0 != null && !var0.isEmpty()
         ? var0.stream()
            .map(var0x -> var0x.split("="))
            .collect(Collectors.toMap(var0x -> (String)var0x[0], var0x -> (String)(var0x.length > 1 ? var0x[1] : var0x[0])))
         : Collections.emptyMap();
   }

   static {
      String[] var5 = new String[29];
      int var3 = 0;
      String var2 = "/\u0016*-d2a& ?%sT\u000f\u001c,'d|e$\r1=x(e8\u000b:ha4i&\u000b~:s=d#\u00009hb4ej\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhd9s%\u001b,+sa{z\u0013dhmm}\f#\t0'd9F#\u000b2,e,)\u00013fzkt/\r6fe9r<\u000b,ff3l#\r'\u000by8e\t\u00010.\u007f;.%\u0018;:a.i>\u000b-\f\u000f7$s8 >\u0001~:s=dj\u001e1$\u007f?yj\r1,s|c%\u00008!q)r+\u001a7'xf 1^#=\f\u000f7$s8 >\u0001~:s=dj\u001d+*6(y:\u000b~<d=n9\b1:{=t#\u00010hp3rj\u0015n5,'17B~+w)s/S%zk\b=\u001d.\rx)m9\t)\u000f*-q3r3S\t+\u001a\u001d'x:i-\u001d\u0012(\u000f-!u\u0013b \u000b=<E(r#\u00009;\u001bd\u000f-;s.t#\u00010eu3d/C='x:i-@4;y2e\u000f\u001c,'d|e$\r1=x(e8\u000b:ha4i&\u000b~)u?e9\u001d7&q|t\"\u000b~-n(e8\u0000?$6.e9\u0001+:u9sj\b1:6=s9\u000b,<\u007f3n9N='r9 )\u00010.\u007f;u8\u000f*!y2,j\r?=e9=1^#\u0005(\u000b?&e\u0011(\u000f-!u\u0013b \u000b=<@=l?\u000b-*\u0018\u000b?,\u007f2gj\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhml}\u0017:\u00012!u%-)\u0001:-;?o$\b7/86s%\u0000\f.\u000b8)c0t\f\u0007;$r*\u0018\u000b?,\u007f2gj\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhml}\u0006,\u0007;$r/\u0017:\u00012!u%-)\u0001:-;?o$\b7/86s%\u0000\u0004$\u000f3-\u0015(\u00011<e(r+\u001ep.y0d/\u001cp%s(a\t8\u000b-'c.c/S\u001bd\u000f-;s.t#\u00010eu3d/C='x:i-@4;y2\r+\f-<d=c>,;)x/\n,\u0007;$r\by:\u000b-,)\u00013fzkt/\r6fe9r<\u000b,ff3l#\r'\u000by8e\t\u00010.\u007f;.%\u0018;:a.i>\u000b";
      int var4 = "/\u0016*-d2a& ?%sT\u000f\u001c,'d|e$\r1=x(e8\u000b:ha4i&\u000b~:s=d#\u00009hb4ej\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhd9s%\u001b,+sa{z\u0013dhmm}\f#\t0'd9F#\u000b2,e,)\u00013fzkt/\r6fe9r<\u000b,ff3l#\r'\u000by8e\t\u00010.\u007f;.%\u0018;:a.i>\u000b-\f\u000f7$s8 >\u0001~:s=dj\u001e1$\u007f?yj\r1,s|c%\u00008!q)r+\u001a7'xf 1^#=\f\u000f7$s8 >\u0001~:s=dj\u001d+*6(y:\u000b~<d=n9\b1:{=t#\u00010hp3rj\u0015n5,'17B~+w)s/S%zk\b=\u001d.\rx)m9\t)\u000f*-q3r3S\t+\u001a\u001d'x:i-\u001d\u0012(\u000f-!u\u0013b \u000b=<E(r#\u00009;\u001bd\u000f-;s.t#\u00010eu3d/C='x:i-@4;y2e\u000f\u001c,'d|e$\r1=x(e8\u000b:ha4i&\u000b~)u?e9\u001d7&q|t\"\u000b~-n(e8\u0000?$6.e9\u0001+:u9sj\b1:6=s9\u000b,<\u007f3n9N='r9 )\u00010.\u007f;u8\u000f*!y2,j\r?=e9=1^#\u0005(\u000b?&e\u0011(\u000f-!u\u0013b \u000b=<@=l?\u000b-*\u0018\u000b?,\u007f2gj\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhml}\u0017:\u00012!u%-)\u0001:-;?o$\b7/86s%\u0000\f.\u000b8)c0t\f\u0007;$r*\u0018\u000b?,\u007f2gj\u000f-;s.t#\u00010;6?o.\u000b~+y2f#\t+:w(i%\u0000rhml}\u0006,\u0007;$r/\u0017:\u00012!u%-)\u0001:-;?o$\b7/86s%\u0000\u0004$\u000f3-\u0015(\u00011<e(r+\u001ep.y0d/\u001cp%s(a\t8\u000b-'c.c/S\u001bd\u000f-;s.t#\u00010eu3d/C='x:i-@4;y2\r+\f-<d=c>,;)x/\n,\u0007;$r\by:\u000b-,)\u00013fzkt/\r6fe9r<\u000b,ff3l#\r'\u000by8e\t\u00010.\u007f;.%\u0018;:a.i>\u000b"
         .length();
      char var1 = '\f';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 7;
         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) {
                     f = var5;
                     String[] var9 = f;
                     ASSERTION_CODE_CONFIG_EXTENSION = f[10];
                     GLOBAL_POLICY_CODE_CONFIG_RESOURCE = var9[19];
                     OVERWRITE_POLICY_CODE_CONFIG_PROPERTY = var9[3];
                     a = Logger.getLogger(PolicyCodeConfigBuilder.class.getName());
                     META_BOOTSTRAP_FOLDER_PATH = ConfigFactory.getProperty(f[21]);
                     return;
                  }

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

                  var2 = "=\u0018+:p#g\u001f\u0014(7aT\u001c\u000f?4wov7\u001e\".k;v+\u0018){r'z5\u0018m)`.w0\u0013*{q'vy\u001c>(`=g0\u0012#(%,|=\u0018m8j!u0\u001a8)d;z6\u0013a{f.g<\u001a\")|rhi\u0000w{~~n";
                  var4 = "=\u0018+:p#g\u001f\u0014(7aT\u001c\u000f?4wov7\u001e\".k;v+\u0018){r'z5\u0018m)`.w0\u0013*{q'vy\u001c>(`=g0\u0012#(%,|=\u0018m8j!u0\u001a8)d;z6\u0013a{f.g<\u001a\")|rhi\u0000w{~~n"
                     .length();
                  var1 = '\f';
                  var7 = -1;
            }

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

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

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

      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 -> 77;
            case 1 -> 105;
            case 2 -> 89;
            case 3 -> 79;
            case 4 -> 17;
            case 5 -> 91;
            default -> 7;
         });
      }

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