package com.l7tech.common.bundle;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;

public class BundleSequencer {
   private static final Logger a;
   private final List<Bundle> b = new LinkedList<>();
   public Boolean restartRequired = false;
   private static final String[] c;

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

   public void addAll(Collection<Bundle> var1) {
      this.b.addAll(var1);
   }

   public List<Bundle> getInstallSequence() {
      List var1 = this.a();
      if (a.isLoggable(Level.INFO)) {
         this.a(var1);
      }

      return var1;
   }

   public List<Bundle> getUninstallSequence() {
      return this.a();
   }

   private List<Bundle> a() {
      LinkedList var1 = new LinkedList();
      LinkedList var2 = new LinkedList();
      HashMap var3 = new HashMap();
      HashMap var4 = new HashMap();
      this.b.forEach(var3x -> {
         BundleDependencyInfo var4x = new BundleDependencyInfo();
         var4x.a = var3x;
         var4.put(var3x.getName(), var3x);
         var3.put(var3x.getName(), var4x);
         var2.add(var3x);
      });
      var3.values().forEach(var2x -> {
         Bundle var3x = var2x.a;
         Iterator var4x = var4.values().iterator();
         boolean var5 = true;

         while (var4x.hasNext()) {
            Bundle var6x = (Bundle)var4x.next();
            if (var3x.dependsOn(var6x)) {
               var2x.b.add(var6x);
               var5 = false;
            }
         }

         if (var5) {
            var1.add(var3x);
            var2x.c = true;
         }
      });
      if (this.a(var3)) {
         Collections.reverse(var2);
         a.log(Level.INFO, c[0]);
         this.restartRequired = true;
         return var2;
      }

      for (Entry var6 : var3.entrySet()) {
         this.resolveDeps((BundleDependencyInfo)var6.getValue(), var3, var1);
      }

      return var1;
   }

   private boolean a(Map<String, BundleDependencyInfo> var1) {
      HashMap var2 = new HashMap();
      var1.keySet().forEach(var1x -> var2.put(var1x, BundleSequencer.VERTEX_STATUS.NOT_VISITED));
      if (var1.size() > 1) {
         for (String var4 : var1.keySet()) {
            if (var2.get(var4) == BundleSequencer.VERTEX_STATUS.NOT_VISITED && this.a(var1, (BundleDependencyInfo)var1.get(var4), var2)) {
               return true;
            }
         }
      }

      return false;
   }

   private boolean a(Map<String, BundleDependencyInfo> var1, BundleDependencyInfo var2, Map<String, BundleSequencer.VERTEX_STATUS> var3) {
      String var4 = var2.a.getName();
      var3.put(var4, BundleSequencer.VERTEX_STATUS.IN_PROCESS);

      for (Bundle var6 : var2.b) {
         if (var3.get(var6.getName()) == BundleSequencer.VERTEX_STATUS.IN_PROCESS) {
            return true;
         }

         if (var3.get(var6.getName()) == BundleSequencer.VERTEX_STATUS.VISITED && this.a(var1, (BundleDependencyInfo)var1.get(var6.getName()), var3)) {
            return true;
         }
      }

      var3.put(var4, BundleSequencer.VERTEX_STATUS.VISITED);
      return false;
   }

   public void resolveDeps(BundleDependencyInfo var1, Map<String, BundleDependencyInfo> var2, List<Bundle> var3) {
      var1.b.forEach(var3x -> this.resolveDeps((BundleDependencyInfo)var2.get(var3x.getName()), var2, var3));
      if (!var1.c) {
         var1.c = true;
         var3.add(var1.a);
      }
   }

   private void a(List<Bundle> var1) {
      StringBuffer var2 = new StringBuffer();
      int var3 = 0;

      while (var3 < var1.size()) {
         var2.append(((Bundle)var1.get(var3)).getName());
         if (++var3 < var1.size()) {
            String[] var4 = c;
            var2.append(var4[1]);
         }
      }

      a.log(Level.INFO, c[2] + var2);
   }

   static {
      String[] var5 = new String[3];
      int var3 = 0;
      String var2 = "E|&C\u0013\u0013rb`5J\u0014\u00147hf,J\tP%cw \u000f\u001c\u001f'haeX\u0013\u0004:oke[\u0012\u0015ruj)Z\u000e\u0019=h%.F\u000eP0sk!C\u001f\u0003|&B$[\u001f\u00073\u007f%7J\t\u00043tq KZ\u00027wp,]\u001f\u0014|\u0003+;e'U`4Z\u001f\u001e1c%*IZ#=jp1F\u0015\u001erMl1\u000f3\u001e!rd)C\u001b\u0004;ik\u007f\u000f";
      int var4 = "E|&C\u0013\u0013rb`5J\u0014\u00147hf,J\tP%cw \u000f\u001c\u001f'haeX\u0013\u0004:oke[\u0012\u0015ruj)Z\u000e\u0019=h%.F\u000eP0sk!C\u001f\u0003|&B$[\u001f\u00073\u007f%7J\t\u00043tq KZ\u00027wp,]\u001f\u0014|\u0003+;e'U`4Z\u001f\u001e1c%*IZ#=jp1F\u0015\u001erMl1\u000f3\u001e!rd)C\u001b\u0004;ik\u007f\u000f"
         .length();
      char var1 = '[';
      int var0 = -1;

      while (true) {
         String var10002 = a(3, a(var2.substring(++var0, var0 + var1)));
         byte var10001 = -1;
         var5[var3++] = var10002;
         if ((var0 += var1) >= var4) {
            c = var5;
            a = Logger.getLogger(BundleSequencer.class.getName());
            return;
         }

         var1 = var2.charAt(var0);
      }
   }

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

      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 -> 5;
            case 1 -> 6;
            case 2 -> 70;
            case 3 -> 44;
            case 4 -> 121;
            case 5 -> 115;
            default -> 81;
         });
      }

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

   private enum VERTEX_STATUS {
      VISITED,
      IN_PROCESS,
      NOT_VISITED;

      // $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[3];
         int var4 = 0;
         String var3 = "d \n\u0016^7ac;\u001b\r\nc!\u0001\u0019Z1qo<\r\u0007|&\r\u0000\\;v";
         int var5 = "d \n\u0016^7ac;\u001b\r\nc!\u0001\u0019Z1qo<\r\u0007|&\r\u0000\\;v".length();
         char var2 = 11;
         int var1 = -1;

         while (true) {
            String var10002 = a(114, a(var3.substring(++var1, var1 + var2)));
            byte var10001 = -1;
            var0[var4++] = var10002;
            if ((var1 += var2) >= var5) {
               VISITED = new BundleSequencer.VERTEX_STATUS();
               IN_PROCESS = new BundleSequencer.VERTEX_STATUS();
               NOT_VISITED = new BundleSequencer.VERTEX_STATUS();
               return;
            }

            var2 = var3.charAt(var1);
         }
      }

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

         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 -> 88;
               case 1 -> 29;
               case 2 -> 44;
               case 3 -> 59;
               case 4 -> 122;
               case 5 -> 12;
               default -> 64;
            });
         }

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