package com.l7tech.server.util;

import com.l7tech.server.event.admin.AdminError;
import com.l7tech.server.event.system.Started;
import com.l7tech.server.event.system.SystemAdminError;
import com.l7tech.util.Config;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.TextUtils;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;

public class AuditingThrowsAdvice implements ThrowsAdvice, PropertyChangeListener, PostStartupApplicationListener {
   private static final Logger a;
   private static final boolean 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 int h;
   private final AtomicBoolean i = new AtomicBoolean(true);
   private final AtomicReference<Collection<Class>> j = new AtomicReference<>(Collections.emptyList());
   private final AtomicReference<Collection<Class>> k = new AtomicReference<>(Collections.emptyList());
   @Inject
   private Provider<ApplicationEventPublisher> publisher;
   private final Config l;
   private static final String[] m;

   public AuditingThrowsAdvice(Config var1) {
      this.l = var1;
   }

   @Override
   public void onApplicationEvent(ApplicationEvent var1) {
      if (var1 instanceof Started) {
         this.a();
      }
   }

   public void afterThrowing(Method var1, Object[] var2, Object var3, Exception var4) {
      if (this.a(var4)) {
         if (JaasUtils.getCurrentUser() != null) {
            ((ApplicationEventPublisher)this.publisher.get()).publishEvent(new AdminError(this, this.b(var4)));
         } else {
            ((ApplicationEventPublisher)this.publisher.get()).publishEvent(new SystemAdminError(this, this.b(var4)));
         }
      }
   }

   @Override
   public void propertyChange(PropertyChangeEvent var1) {
      if (var1.getPropertyName() != null && var1.getPropertyName().startsWith(m[12])) {
         this.a();
      }
   }

   static boolean a(Exception var0, boolean var1, Collection<Class> var2, Collection<Class> var3) {
      boolean var4 = var1;
      Class var5 = a(var2, var0);
      Class var6 = a(var3, var0);
      if (var5 != null && var6 != null) {
         if (!var5.equals(var6)) {
            var4 = var6.isAssignableFrom(var5);
         }
      } else if (var5 != null) {
         var4 = true;
      } else if (var6 != null) {
         var4 = false;
      }

      return var4;
   }

   private void a() {
      String[] var1 = m;
      this.i.set(this.l.getBooleanProperty(var1[8], true));
      a(this.j, this.l.getProperty(var1[4], ""));
      a(this.k, this.l.getProperty(var1[10], ""));
   }

   private static void a(AtomicReference<Collection<Class>> var0, String var1) {
      ArrayList var2 = new ArrayList();
      String var10000 = var1.trim();
      String[] var9 = m;
      String[] var3 = var10000.split(var9[2]);

      for (String var7 : var3) {
         try {
            if (var7.isEmpty()) {
               continue;
            }
         } catch (ClassNotFoundException var11) {
            throw a(var11);
         }

         try {
            var2.add(Class.forName(var7));
         } catch (ClassNotFoundException var10) {
            var9 = m;
            a.log(Level.WARNING, var9[0] + var7 + var9[5]);
         }
      }

      var0.set(Collections.unmodifiableCollection(var2));
   }

   private boolean a(Exception var1) {
      return b && !MySqlFailureThrowsAdvice.a(var1) && a(var1, this.i.get(), this.j.get(), this.k.get());
   }

   private static Class a(Collection<Class> var0, Exception var1) {
      Class var2 = null;

      for (Class var4 : var0) {
         if (var4.isInstance(var1) && (var2 == null || var2.isAssignableFrom(var4))) {
            var2 = var4;
         }
      }

      return var2;
   }

   private String b(Exception var1) {
      return m[9] + TextUtils.truncateStringAtEnd(ExceptionUtils.getMessage(var1), h);
   }

   static {
      String[] var5 = new String[14];
      int var3 = 0;
      String var2 = "&w5\u0010[:\u0010\b02\u0011_2\u0012\u0006t{\u001aQ0\u001b\u001fd2\u0010Gs\u001d\u0003q(\f\t0\u0011\u0001v2\u0018\\!\u001f\u001by4\u0011\tt\u0016\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rA\u00033cp\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAu#\u001cE&\u001a\nc\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAy5\u001cE&\u001a\nc\u0002H>'\f\u007f6QEd\n\ns3QZ6\f\u0019u)QH7\u0013\u0006~u\u001e\\7\u0017\u001bU#\u001cL#\n\u0006\u007f5\f\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAy5\u001cE&\u001a\nc%\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAt>\u0019H&\u0012\u001bY5\u001cE&\u001a\nc\u0016.t6\u0016G:\r\u001bb:\u000b@%\u001bOU)\rF!DO\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAu#\u001cE&\u001a\nc\u0016.t6\u0016G:\r\u001bb:\u000b@%\u001bOU)\rF!DO";
      int var4 = "&w5\u0010[:\u0010\b02\u0011_2\u0012\u0006t{\u001aQ0\u001b\u001fd2\u0010Gs\u001d\u0003q(\f\t0\u0011\u0001v2\u0018\\!\u001f\u001by4\u0011\tt\u0016\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rA\u00033cp\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAu#\u001cE&\u001a\nc\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAy5\u001cE&\u001a\nc\u0002H>'\f\u007f6QEd\n\ns3QZ6\f\u0019u)QH7\u0013\u0006~u\u001e\\7\u0017\u001bU#\u001cL#\n\u0006\u007f5\f\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAy5\u001cE&\u001a\nc%\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAt>\u0019H&\u0012\u001bY5\u001cE&\u001a\nc\u0016.t6\u0016G:\r\u001bb:\u000b@%\u001bOU)\rF!DO\u001e\u000ee?\u0016]}\u001f\u000b}2\u0011l+\u001d\n`/\u0016F=\rAu#\u001cE&\u001a\nc\u0016.t6\u0016G:\r\u001bb:\u000b@%\u001bOU)\rF!DO"
         .length();
      char var1 = '0';
      int var7 = -1;

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

         while (true) {
            String var9 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var9;
                  if ((var7 += var1) >= var4) {
                     m = var5;
                     String[] var10 = m;
                     c = m[1];
                     f = var10[3];
                     g = var10[9];
                     e = var10[7];
                     d = var10[13];
                     a = Logger.getLogger(AuditingThrowsAdvice.class.getName());
                     String[] var8 = m;
                     b = ConfigFactory.getBooleanProperty(var8[6], true);
                     h = 255 - var8[11].length();
                     return;
                  }

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

                  var2 = "\u0006m7\u001eUu\u0017\u0003u:\u0019d#\u0015\u0002h'\u001eN5\u0005I%\u0006m7\u001eUu\u0017\u0003u:\u0019d#\u0015\u0002h'\u001eN5\u0005I|6\u0011@.\u001a\u0013Q=\u0014M.\u0012\u0002k";
                  var4 = "\u0006m7\u001eUu\u0017\u0003u:\u0019d#\u0015\u0002h'\u001eN5\u0005I%\u0006m7\u001eUu\u0017\u0003u:\u0019d#\u0015\u0002h'\u001eN5\u0005I|6\u0011@.\u001a\u0013Q=\u0014M.\u0012\u0002k"
                     .length();
                  var1 = 22;
                  var7 = -1;
            }

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

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

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

      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 -> 26;
            case 1 -> 101;
            case 2 -> 46;
            case 3 -> 10;
            case 4 -> 92;
            case 5 -> 38;
            default -> 11;
         });
      }

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