package com.l7tech.server.stepdebug;

import com.l7tech.gateway.common.audit.Audit;
import com.l7tech.gateway.common.audit.AuditFactory;
import com.l7tech.gateway.common.stepdebug.DebugState;
import com.l7tech.objectmodel.Goid;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.server.event.admin.PolicyDebuggerAdminEvent;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.util.Background;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.Option;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;

public class DebugManagerImpl implements ApplicationEventPublisherAware, DebugManager {
   private static final Logger a;
   private static final String b;
   private static final long c = 86460000L;
   private static final String d;
   private static final long e = 86400000L;
   private final Audit f;
   private ApplicationEventPublisher g;
   private final Map<String, DebugContext> h;
   private final Map<Goid, DebugContext> i;
   private final Lock j;
   private static final String[] k;

   public DebugManagerImpl(@NotNull AuditFactory var1) {
      if (var1 == null) {
         a(0);
      }

      super();
      this.h = new ConcurrentHashMap<>();
      this.i = new ConcurrentHashMap<>();
      this.j = new ReentrantLock(true);
      this.f = var1.newInstance(this, a);
      String[] var6 = k;
      long var2 = ConfigFactory.getLongProperty(var6[9], 86460000L);
      long var4 = ConfigFactory.getLongProperty(var6[14], 86400000L);
      Background.scheduleRepeated(new c(this, var4), var2, var2);
   }

   public void setApplicationEventPublisher(ApplicationEventPublisher var1) {
      this.g = var1;
   }

   @NotNull
   @Override
   public DebugContext createDebugContext(@NotNull Goid var1) {
      try {
         if (var1 == null) {
            a(1);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      String var2 = UUID.randomUUID().toString();
      DebugContext var3 = new DebugContext(var1, var2, this.f);

      try {
         this.h.put(var2, var3);
         if (var3 == null) {
            a(2);
         }

         return var3;
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }
   }

   // $VF: Could not verify finally blocks. A semaphore variable has been added to preserve control flow.
   // 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!)
   @NotNull
   @Override
   public Option<String> startDebug(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(3);
         }
      } catch (IllegalArgumentException var18) {
         throw a(var18);
      }

      this.j.lock();
      boolean var13 = false /* VF: Semaphore variable */;

      Option var19;
      label117: {
         try {
            var13 = true;
            DebugContext var2 = this.a(var1);
            Goid var3 = var2.getPolicyGoid();
            boolean var4 = false;

            for (DebugContext var6 : this.h.values()) {
               try {
                  if (!var3.equals(var6.getPolicyGoid()) || var6.getDebugState().equals(DebugState.STOPPED)) {
                     continue;
                  }
               } catch (IllegalArgumentException var16) {
                  throw a(var16);
               }

               var4 = true;
            }

            if (var4) {
               var19 = Option.some(k[13]);
               var13 = false;
               break label117;
            }

            this.g.publishEvent(new PolicyDebuggerAdminEvent(this, true, var3));
            var2.startDebugging();
            this.i.put(var3, var2);
            var13 = false;
         } finally {
            if (var13) {
               this.j.unlock();
            }
         }

         this.j.unlock();

         try {
            Option var10000 = Option.none();
            if (var10000 == null) {
               a(5);
            }

            return var10000;
         } catch (IllegalArgumentException var15) {
            throw a(var15);
         }
      }

      try {
         this.j.unlock();
         if (var19 == null) {
            a(4);
         }

         return var19;
      } catch (IllegalArgumentException var14) {
         throw a(var14);
      }
   }

   @Override
   public void stopDebug(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(6);
         }
      } catch (IllegalArgumentException var10) {
         throw a(var10);
      }

      this.j.lock();

      try {
         DebugContext var2 = this.getDebugContext(var1);
         if (var2 != null) {
            Goid var3 = var2.getPolicyGoid();

            try {
               this.i.remove(var3);
               if (!var2.getDebugState().equals(DebugState.STOPPED)) {
                  this.g.publishEvent(new PolicyDebuggerAdminEvent(this, false, var3));
                  var2.stopDebugging();
               }
            } catch (IllegalArgumentException var8) {
               throw a(var8);
            }
         }
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void stepOver(@NotNull String var1, @NotNull Collection<Integer> var2) {
      try {
         if (var1 == null) {
            a(7);
         }
      } catch (IllegalArgumentException var9) {
         throw a(var9);
      }

      try {
         if (var2 == null) {
            a(8);
         }
      } catch (IllegalArgumentException var10) {
         throw a(var10);
      }

      this.j.lock();

      try {
         DebugContext var3 = this.a(var1);
         var3.stepOver(var2);
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void stepInto(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(9);
         }
      } catch (IllegalArgumentException var7) {
         throw a(var7);
      }

      this.j.lock();

      try {
         DebugContext var2 = this.a(var1);
         var2.stepInto();
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void stepOut(@NotNull String var1, @NotNull Collection<Integer> var2) {
      try {
         if (var1 == null) {
            a(10);
         }
      } catch (IllegalArgumentException var9) {
         throw a(var9);
      }

      try {
         if (var2 == null) {
            a(11);
         }
      } catch (IllegalArgumentException var10) {
         throw a(var10);
      }

      this.j.lock();

      try {
         DebugContext var3 = this.a(var1);
         var3.stepOut(var2);
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void resume(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(12);
         }
      } catch (IllegalArgumentException var7) {
         throw a(var7);
      }

      this.j.lock();

      try {
         DebugContext var2 = this.a(var1);
         var2.resume();
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void terminateDebug(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(13);
         }
      } catch (IllegalArgumentException var9) {
         throw a(var9);
      }

      this.j.lock();

      try {
         this.stopDebug(var1);
         DebugContext var2 = this.getDebugContext(var1);

         try {
            if (var2 != null) {
               var2.setIsTerminated(true);
            }
         } catch (IllegalArgumentException var7) {
            throw a(var7);
         }

         this.h.remove(var1);
      } finally {
         this.j.unlock();
      }
   }

   @Override
   public void toggleBreakpoint(@NotNull String var1, @NotNull Collection<Integer> var2) {
      try {
         if (var1 == null) {
            a(14);
         }
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }

      try {
         if (var2 == null) {
            a(15);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      DebugContext var3 = this.a(var1);
      var3.toggleBreakpoint(var2);
   }

   @Override
   public void removeAllBreakpoints(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(16);
         }
      } catch (IllegalArgumentException var3) {
         throw a(var3);
      }

      DebugContext var2 = this.a(var1);
      var2.removeAllBreakpoints();
   }

   @Override
   public void addUserContextVariable(@NotNull String var1, @NotNull String var2) {
      try {
         if (var1 == null) {
            a(17);
         }
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }

      try {
         if (var2 == null) {
            a(18);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      DebugContext var3 = this.a(var1);
      var3.addUserContextVariable(var2);
   }

   @Override
   public void removeUserContextVariable(@NotNull String var1, @NotNull String var2) {
      try {
         if (var1 == null) {
            a(19);
         }
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }

      try {
         if (var2 == null) {
            a(20);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      DebugContext var3 = this.a(var1);
      var3.removeUserContextVariable(var2);
   }

   @Nullable
   @Override
   public DebugContext getDebugContext(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(21);
         }
      } catch (IllegalArgumentException var2) {
         throw a(var2);
      }

      return this.h.get(var1);
   }

   @Override
   public void onMessageArrived(@NotNull PolicyEnforcementContext var1, @NotNull Goid var2) {
      try {
         if (var1 == null) {
            a(22);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      try {
         if (var2 == null) {
            a(23);
         }
      } catch (IllegalArgumentException var6) {
         throw a(var6);
      }

      DebugContext var3 = this.i.remove(var2);

      try {
         if (var3 != null) {
            var3.onMessageArrived(var1);
         }
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }
   }

   @Override
   public void onMessageFinished(@NotNull PolicyEnforcementContext var1, @Nullable AssertionStatus var2) {
      try {
         if (var1 == null) {
            a(24);
         }
      } catch (IllegalArgumentException var5) {
         throw a(var5);
      }

      DebugContext var3 = var1.getDebugContext();

      try {
         if (var3 != null) {
            var3.onMessageFinished(var1, var2);
            this.stopDebug(var3.getTaskId());
         }
      } catch (IllegalArgumentException var4) {
         throw a(var4);
      }
   }

   void a() {
      for (DebugContext var2 : this.h.values()) {
         this.terminateDebug(var2.getTaskId());
      }

      this.h.clear();
      this.i.clear();
   }

   @NotNull
   private DebugContext a(@NotNull String var1) {
      try {
         if (var1 == null) {
            a(25);
         }
      } catch (IllegalArgumentException var3) {
         throw a(var3);
      }

      try {
         DebugContext var10000 = this.h.get(var1);
         if (var10000 == null) {
            a(26);
         }

         return var10000;
      } catch (IllegalArgumentException var2) {
         throw a(var2);
      }
   }

   static {
      String[] var5 = new String[35];
      int var3 = 0;
      String var2 = "Y%J6\f\u00177Y\u0003Q\u001c\u001d\u0010:J\u0006_\u001b\u0005<$p5R\u001e\u0011Q.s\u0017\u001a\u0006#Y%x\u001b\u0007\u001c1V%Z\u000f_3M\u0017\u001b\u0001+Q.p\u0007\u0004\u0017'L\u0014L%S\u001d\u001f\u0010\u0003R,|\u0000\f\u0014)N/W\u001c\u001d\u0006\f_5Z\u001b\u001d3#]4Q\u0000\u0010\u0006J!M\u0019 \u0011\bM4[\u0002 \u001b6Q\u0019L%S\u001d\u001f\u0010\u0017M%L1\u0006\u001b6[8J$\b\u0007+_\"R\u0017*~\u000eQ\u0006'\u0000.R`S\u0017\u001d\u001d-Z`\u001b\u0001GP1\u001e-K\u0001\u001dU,Q4\u001e\u0000\f\u00017L.\u001e\u001c\u001c\u0019.>]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0003R\u0017\b\u001b\u000bP4[\u0000\u001f\u0014.s)R\u001e\u0000\u0006\u0010J/Y\u0015\u0005\u0010\u0000L%_\u0019\u0019\u001a+P48]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0014W\u001f\f\u001a7J\rW\u001e\u0005\u001c1\nM4_\u0000\u001d1'\\5Yb}!P\u001c\u0006\u0001bM4_\u0000\u001dU\u0011[2H\u001b\n\u0010bz%\\\u0007\u000e\u0012'Ln\u001e&\u0001\u00100[`W\u0001I\u0014bm%L\u0004\u0000\u0016'\u001e\u0004[\u0010\u001c\u0012%[2\u001e\u0013\u0005\u0007'_$GR\u001b\u0000,P)P\u0015I\u0013-L`J\u001a\fU1[2H\u001b\n\u0010mN/R\u001b\n\fl8]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0014W\u001f\f\u001a7J\rW\u001e\u0005\u001c1\u0019Y%J6\f\u00177Y\u0003Q\u001c\u001d\u0010:J\u0006_\u001b\u0005<$p5R\u001e\u0006\u0002)P\u001b\u001dK>]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0003R\u0017\b\u001b\u000bP4[\u0000\u001f\u0014.s)R\u001e\u0000\u0006\nM4_\u0000\u001d1'\\5Y\u0003N%],]/S]\u0005B6[#V]\u001a\u00100H%L]\u001a\u0001'N$[\u0010\u001c\u0012mz%\\\u0007\u000e8#P!Y\u0017\u001b</N,\tM4Q\u0002-\u0010 K'>\u007f2Y\u0007\u0004\u0010,J`X\u001d\u001bU\u0002p/J<\u001c\u0019.\u001e0_\u0000\b\u0018'J%LRNP1\u0019`Q\u0014IP1\u0010eMR\u0004\u00001J`P\u001d\u001dU [`P\u0007\u0005\u0019\nN/R\u001b\n\f\u0005Q)Z\u0004P!S\u0017\u000eJ%L\u001f\u0000\u001b#J%z\u0017\u000b\u0000%\u0016_$Z'\u001a\u00100}/P\u0006\f\r6h!L\u001b\b\u0017.[,]/S]\u0005B6[#V]\u001a\u00100H%L]\u001a\u0001'N$[\u0010\u001c\u0012mz%\\\u0007\u000e8#P!Y\u0017\u001b</N,\u0006L%M\u0007\u0004\u0010\bM4[\u0002&\u0003'L\u0012]2[\u0013\u001d\u0010\u0006[\"K\u0015*\u001a,J%F\u0006\u0010Q.s\u0017\u001a\u0006#Y%\u007f\u0000\u001b\u001c4[$\u0012]2[\u0013\u001d\u0010\u0006[\"K\u0015*\u001a,J%F\u0006";
      int var4 = "Y%J6\f\u00177Y\u0003Q\u001c\u001d\u0010:J\u0006_\u001b\u0005<$p5R\u001e\u0011Q.s\u0017\u001a\u0006#Y%x\u001b\u0007\u001c1V%Z\u000f_3M\u0017\u001b\u0001+Q.p\u0007\u0004\u0017'L\u0014L%S\u001d\u001f\u0010\u0003R,|\u0000\f\u0014)N/W\u001c\u001d\u0006\f_5Z\u001b\u001d3#]4Q\u0000\u0010\u0006J!M\u0019 \u0011\bM4[\u0002 \u001b6Q\u0019L%S\u001d\u001f\u0010\u0017M%L1\u0006\u001b6[8J$\b\u0007+_\"R\u0017*~\u000eQ\u0006'\u0000.R`S\u0017\u001d\u001d-Z`\u001b\u0001GP1\u001e-K\u0001\u001dU,Q4\u001e\u0000\f\u00017L.\u001e\u001c\u001c\u0019.>]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0003R\u0017\b\u001b\u000bP4[\u0000\u001f\u0014.s)R\u001e\u0000\u0006\u0010J/Y\u0015\u0005\u0010\u0000L%_\u0019\u0019\u001a+P48]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0014W\u001f\f\u001a7J\rW\u001e\u0005\u001c1\nM4_\u0000\u001d1'\\5Yb}!P\u001c\u0006\u0001bM4_\u0000\u001dU\u0011[2H\u001b\n\u0010bz%\\\u0007\u000e\u0012'Ln\u001e&\u0001\u00100[`W\u0001I\u0014bm%L\u0004\u0000\u0016'\u001e\u0004[\u0010\u001c\u0012%[2\u001e\u0013\u0005\u0007'_$GR\u001b\u0000,P)P\u0015I\u0013-L`J\u001a\fU1[2H\u001b\n\u0010mN/R\u001b\n\fl8]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0014W\u001f\f\u001a7J\rW\u001e\u0005\u001c1\u0019Y%J6\f\u00177Y\u0003Q\u001c\u001d\u0010:J\u0006_\u001b\u0005<$p5R\u001e\u0006\u0002)P\u001b\u001dK>]/S\\\u0005B6[#V\\\u001a\u00100H%L\\\u001a\u0001'N$[\u0010\u001c\u0012lW._\u0011\u001d\u001c4[\u0013[\u0001\u001a\u001c-P\u0003R\u0017\b\u001b\u000bP4[\u0000\u001f\u0014.s)R\u001e\u0000\u0006\nM4_\u0000\u001d1'\\5Y\u0003N%],]/S]\u0005B6[#V]\u001a\u00100H%L]\u001a\u0001'N$[\u0010\u001c\u0012mz%\\\u0007\u000e8#P!Y\u0017\u001b</N,\tM4Q\u0002-\u0010 K'>\u007f2Y\u0007\u0004\u0010,J`X\u001d\u001bU\u0002p/J<\u001c\u0019.\u001e0_\u0000\b\u0018'J%LRNP1\u0019`Q\u0014IP1\u0010eMR\u0004\u00001J`P\u001d\u001dU [`P\u0007\u0005\u0019\nN/R\u001b\n\f\u0005Q)Z\u0004P!S\u0017\u000eJ%L\u001f\u0000\u001b#J%z\u0017\u000b\u0000%\u0016_$Z'\u001a\u00100}/P\u0006\f\r6h!L\u001b\b\u0017.[,]/S]\u0005B6[#V]\u001a\u00100H%L]\u001a\u0001'N$[\u0010\u001c\u0012mz%\\\u0007\u000e8#P!Y\u0017\u001b</N,\u0006L%M\u0007\u0004\u0010\bM4[\u0002&\u0003'L\u0012]2[\u0013\u001d\u0010\u0006[\"K\u0015*\u001a,J%F\u0006\u0010Q.s\u0017\u001a\u0006#Y%\u007f\u0000\u001b\u001c4[$\u0012]2[\u0013\u001d\u0010\u0006[\"K\u0015*\u001a,J%F\u0006"
         .length();
      char var1 = 25;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 95;
         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) {
                     k = var5;
                     String[] var9 = k;
                     d = k[11];
                     b = var9[17];
                     a = Logger.getLogger(DebugManagerImpl.class.getName());
                     return;
                  }

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

                  var2 = "f\u001fp)\r+\u001d\u000fr\u000ea\u001d'<\u001cr(z76;\u0011a";
                  var4 = "f\u001fp)\r+\u001d\u000fr\u000ea\u001d'<\u001cr(z76;\u0011a".length();
                  var1 = 7;
                  var7 = -1;
            }

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

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

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

      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 -> 97;
            case 1 -> 31;
            case 2 -> 97;
            case 3 -> 45;
            case 4 -> 54;
            case 5 -> 42;
            default -> 29;
         });
      }

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