package com.l7tech.server.cluster;

import com.l7tech.gateway.common.cluster.ClusterProperty;
import com.l7tech.gateway.common.cluster.ImmutableClusterProperty;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.server.event.EntityInvalidationEvent;
import com.l7tech.server.util.PostStartupApplicationListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.context.ApplicationEvent;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;

@ManagedResource(description = "Cluster Property Cache", objectName = "l7tech:type=ClusterPropertyCache")
public class ClusterPropertyCache implements PostStartupApplicationListener {
   private static final Logger a;
   private final AtomicReference<Map<String, ClusterProperty>> b = new AtomicReference<>();
   private final Object c = new Object();
   private ClusterPropertyManager d;
   private ClusterPropertyListener e;
   private static final String[] f;

   public void setClusterPropertyManager(ClusterPropertyManager var1) {
      synchronized (this.c) {
         if (var1 == null) {
            String[] var7 = f;
            throw new IllegalArgumentException(var7[9]);
         }

         try {
            if (this.d != null) {
               throw new IllegalStateException(f[5]);
            }
         } catch (FindException var11) {
            throw a(var11);
         }
      }

      try {
         Collection var13 = var1.findAll();
         TreeMap var3 = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

         for (ClusterProperty var5 : var13) {
            try {
               if (var5.getName() != null) {
                  var3.put(var5.getName(), new ImmutableClusterProperty(var5));
               }
            } catch (FindException var9) {
               throw a(var9);
            }
         }

         this.b.set(Collections.unmodifiableMap(var3));
      } catch (FindException var10) {
         a.log(Level.WARNING, f[3], var10);
      }

      synchronized (this.c) {
         this.d = var1;
      }
   }

   public void setClusterPropertyListener(ClusterPropertyListener var1) {
      synchronized (this.c) {
         if (var1 == null) {
            String[] var4 = f;
            throw new IllegalArgumentException(var4[12]);
         }

         try {
            if (this.e != null) {
               throw new IllegalStateException(f[8]);
            }
         } catch (IllegalArgumentException var5) {
            throw a(var5);
         }

         this.e = var1;
      }
   }

   @Override
   public void onApplicationEvent(ApplicationEvent var1) {
      if (var1 instanceof EntityInvalidationEvent var2 && ClusterProperty.class.equals(var2.getEntityClass())) {
         ClusterPropertyManager var3;
         ClusterPropertyListener var4;
         synchronized (this.c) {
            var3 = this.d;
            var4 = this.e;
         }

         try {
            if (var3 == null) {
               a.warning(f[1]);
               return;
            }
         } catch (FindException var24) {
            throw a(var24);
         }

         Goid[] var25 = var2.getEntityIds();

         try {
            if (var25 == null || var25.length <= 0) {
               return;
            }
         } catch (FindException var23) {
            throw a(var23);
         }

         Map var6 = this.b.get();
         TreeMap var7 = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

         try {
            if (var6 != null) {
               var7.putAll(var6);
            }
         } catch (FindException var22) {
            throw a(var22);
         }

         ArrayList var8 = new ArrayList();
         ArrayList var9 = new ArrayList();

         label98:
         for (Goid var13 : var25) {
            try {
               ClusterProperty var14 = (ClusterProperty)var3.findByPrimaryKey(var13);

               label130: {
                  try {
                     if (var14 != null && var14.getName() != null) {
                        break label130;
                     }
                  } catch (FindException var20) {
                     throw a(var20);
                  }

                  if (var14 != null) {
                     continue;
                  }

                  Iterator var15 = var7.values().iterator();

                  while (var15.hasNext()) {
                     ClusterProperty var16 = (ClusterProperty)var15.next();

                     try {
                        if (var16.getGoid().equals(var13)) {
                           var15.remove();
                           var9.add(var16);
                           continue label98;
                        }
                     } catch (FindException var19) {
                        throw a(var19);
                     }
                  }
                  continue;
               }

               String[] var17 = f;
               a.log(Level.FINE, var17[4], var14.getName());
               ImmutableClusterProperty var30 = new ImmutableClusterProperty(var14);
               ClusterProperty var31 = (ClusterProperty)var7.put(var30.getName(), var30);
               var8.add(new ClusterProperty[]{var31, var30});
            } catch (FindException var21) {
               a.log(Level.WARNING, f[2], var21);
            }
         }

         this.b.set(Collections.unmodifiableMap(var7));

         for (ClusterProperty[] var28 : var8) {
            this.a(var4, var28[0], var28[1]);
         }

         for (ClusterProperty var29 : var9) {
            this.a(var4, var29);
         }
      }
   }

   public ClusterProperty getCachedEntityByName(String var1) {
      ClusterProperty var2 = null;
      Map var3 = this.b.get();
      if (var3 != null) {
         var2 = (ClusterProperty)var3.get(var1);
      }

      return var2;
   }

   @Deprecated
   public ClusterProperty getCachedEntityByName(String var1, int var2) {
      ClusterProperty var3 = null;
      Map var4 = this.b.get();
      if (var4 != null) {
         var3 = (ClusterProperty)var4.get(var1);
      }

      return var3;
   }

   @ManagedOperation(description = "Get Property Value")
   public String getPropertyValue(String var1) {
      String var2 = null;
      ClusterProperty var3 = this.getCachedEntityByName(var1);
      if (var3 != null) {
         var2 = var3.getValue();
      }

      return var2;
   }

   @ManagedAttribute(description = "Cached Property Names", currencyTimeLimit = 30)
   public Set<String> getPropertyNames() {
      TreeSet var1 = new TreeSet();
      Map var2 = this.b.get();

      try {
         if (var2 != null) {
            var1.addAll(var2.keySet());
         }

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

   public void refreshFromDatabase() {
      ClusterPropertyManager var1;
      synchronized (this.c) {
         var1 = this.d;
      }

      try {
         if (var1 == null) {
            throw new IllegalStateException(f[10]);
         }
      } catch (FindException var10) {
         throw a(var10);
      }

      try {
         Collection var11 = var1.findAll();
         TreeMap var3 = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

         for (ClusterProperty var5 : var11) {
            try {
               if (var5.getName() != null) {
                  var3.put(var5.getName(), new ImmutableClusterProperty(var5));
               }
            } catch (FindException var7) {
               throw a(var7);
            }
         }

         this.b.set(Collections.unmodifiableMap(var3));
         String[] var6 = f;
         a.log(Level.FINE, var6[11], var3.size());
      } catch (FindException var9) {
         a.log(Level.WARNING, f[6], var9);
      }
   }

   private void a(ClusterPropertyListener var1, ClusterProperty var2, ClusterProperty var3) {
      if (var1 != null) {
         try {
            var1.clusterPropertyChanged(var2, var3);
         } catch (Exception var5) {
            a.log(Level.WARNING, f[7], var5);
         }
      }
   }

   private void a(ClusterPropertyListener var1, ClusterProperty var2) {
      if (var1 != null) {
         try {
            var1.clusterPropertyDeleted(var2);
         } catch (Exception var4) {
            a.log(Level.WARNING, f[0], var4);
         }
      }
   }

   static {
      String[] var5 = new String[13];
      int var3 = 0;
      String var2 = "P)H:wEv35O&sEvg<\u001d%jSpv+X;#Tla JifXgv5I lN*KA ^,jVaweX'wIpjeT'uAhz!\\=jOj3 K,mT$q0Ii`Lq`1X;#Pv|5X;wY$~$S(dEv3,NimOp36X=\"\u001eV7O&q\u0000h|$Y mG$p)H:wEv35O&sEvg< V7O&q\u0000h|$Y mG$p)H:wEv35O&sEvg,X:\u001aC7R9fRpje\u001anx\u0010y4b\u0011ivP`r1X--#p)H:wEvC7R9fRpj\b\\'bGaae\\%qEew<\u001d:fT%1V7O&q\u0000vv#O,pHm}\"\u001d*oUwg OisRkc O=jEw3#O&n\u0000`r1\\+bSa*P)H:wEv35O&sEvg<\u001d%jSpv+X;#Tla JifXgv5I lN*$p)H:wEvC7R9fRpj\tT:wEjv7\u001d(oRar!DipEp2'p)H:wEvC7R9fRpj\b\\'bGaaeP<pT$}*IiaE$}0Q%.P$S'lT$a [;fSl)e^%vSpv7m;lPaa1D\u0004bNet OimOp36X=";
      int var4 = "P)H:wEv35O&sEvg<\u001d%jSpv+X;#Tla JifXgv5I lN*KA ^,jVaweX'wIpjeT'uAhz!\\=jOj3 K,mT$q0Ii`Lq`1X;#Pv|5X;wY$~$S(dEv3,NimOp36X=\"\u001eV7O&q\u0000h|$Y mG$p)H:wEv35O&sEvg< V7O&q\u0000h|$Y mG$p)H:wEv35O&sEvg,X:\u001aC7R9fRpje\u001anx\u0010y4b\u0011ivP`r1X--#p)H:wEvC7R9fRpj\b\\'bGaae\\%qEew<\u001d:fT%1V7O&q\u0000vv#O,pHm}\"\u001d*oUwg OisRkc O=jEw3#O&n\u0000`r1\\+bSa*P)H:wEv35O&sEvg<\u001d%jSpv+X;#Tla JifXgv5I lN*$p)H:wEvC7R9fRpj\tT:wEjv7\u001d(oRar!DipEp2'p)H:wEvC7R9fRpj\b\\'bGaaeP<pT$}*IiaE$}0Q%.P$S'lT$a [;fSl)e^%vSpv7m;lPaa1D\u0004bNet OimOp36X="
         .length();
      char var1 = '*';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 108;
         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) {
                     f = var5;
                     a = Logger.getLogger(ClusterPropertyCache.class.getName());
                     return;
                  }

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

                  var2 = "i\bs\u0013N{D^\t5\u0002G}_O\bgA[zCK\bg\u0015R(OZ\u000e}\u0004\u000bn^T\u00005\u0005J|MY\ff\u0004\u000b W\u000b\u00105\u0011Yg\\^\u001fa\bN{\u0005(X\u0001`\u0012_m^k\u001fz\u0011NzXB!|\u0012_mB^\u001f5\f^{X\u001b\u0003z\u0015\u000bjI\u001b\u0003`\rG";
                  var4 = "i\bs\u0013N{D^\t5\u0002G}_O\bgA[zCK\bg\u0015R(OZ\u000e}\u0004\u000bn^T\u00005\u0005J|MY\ff\u0004\u000b W\u000b\u00105\u0011Yg\\^\u001fa\bN{\u0005(X\u0001`\u0012_m^k\u001fz\u0011NzXB!|\u0012_mB^\u001f5\f^{X\u001b\u0003z\u0015\u000bjI\u001b\u0003`\rG"
                     .length();
                  var1 = '?';
                  var7 = -1;
            }

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

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

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

      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 -> 127;
            case 1 -> 41;
            case 2 -> 81;
            case 3 -> 37;
            case 4 -> 111;
            case 5 -> 76;
            default -> 104;
         });
      }

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