package com.l7tech.server.admin;

import com.l7tech.common.io.WhirlycacheFactory;
import com.l7tech.identity.Group;
import com.l7tech.identity.GroupBean;
import com.l7tech.identity.GroupManager;
import com.l7tech.identity.IdentityProvider;
import com.l7tech.identity.User;
import com.l7tech.identity.UserBean;
import com.l7tech.identity.ValidationException;
import com.l7tech.objectmodel.EntityType;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.IdentityHeader;
import com.l7tech.util.Either;
import com.l7tech.util.ExceptionUtils;
import com.whirlycott.cache.Cache;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
import java.util.logging.Logger;

class GroupCache {
   private static final Logger a;
   private final AtomicInteger b = new AtomicInteger();
   private final AtomicInteger c = new AtomicInteger();
   private final Map<Goid, Long> d = new ConcurrentHashMap<>();
   private final Cache e;
   private static final String[] f;

   GroupCache(String var1, int var2, int var3, int var4) {
      this.b.set(var3);
      this.c.set(var4);
      this.e = var2 < 1 ? null : WhirlycacheFactory.createCache(var1, var2, 293, WhirlycacheFactory.POLICY_LFU);
   }

   public Set<IdentityHeader> getCachedValidatedGroups(User var1, IdentityProvider var2, boolean var3) throws ValidationException {
      Goid var4 = var2.getConfig().getGoid();
      GroupCache.CacheKey var5 = new GroupCache.CacheKey(var4, EntityType.USER, var1.getId());
      Set var6 = this.a(var5, var1.getLogin(), var2, this.b.get());

      try {
         if (var6 != null) {
            return var6;
         }
      } catch (ValidationException var7) {
         throw a(var7);
      }

      return this.a(var1, var5, var2, var3);
   }

   public Set<IdentityHeader> getCachedGroups(Group var1, IdentityProvider var2) throws FindException {
      Goid var3 = var2.getConfig().getGoid();
      GroupCache.CacheKey var4 = new GroupCache.CacheKey(var3, EntityType.GROUP, var1.getId());
      Set var5 = this.a(var4, var1.getName(), var2, this.b.get());

      try {
         if (var5 != null) {
            return var5;
         }
      } catch (FindException var6) {
         throw a(var6);
      }

      return this.a(var1, var4, var2);
   }

   public void invalidate(Goid var1) {
      this.d.put(var1, System.currentTimeMillis());
   }

   void a(int var1) {
      this.b.set(var1);
   }

   private Set<IdentityHeader> a(GroupCache.CacheKey var1, String var2, IdentityProvider var3, int var4) {
      if (this.e == null) {
         return null;
      }

      CacheEntry var5 = null;
      Object var6 = this.e.retrieve(var1);
      if (var6 != null && var6 instanceof CacheEntry) {
         var5 = (CacheEntry)var6;
      }

      if (var5 == null) {
         return null;
      }

      long var7 = var5.getTimestamp();
      Long var9 = this.d.get(var1.b);
      if (var7 + var4 <= System.currentTimeMillis() || var9 != null && var9 >= var7) {
         if (a.isLoggable(Level.FINE)) {
            a.log(Level.FINE, f[4], new String[]{var2, var3.getConfig().getName()});
         }

         return null;
      } else {
         if (a.isLoggable(Level.FINE)) {
            String[] var10 = f;
            a.log(Level.FINE, var10[6], new String[]{var2, var3.getConfig().getName()});
         }

         return (Set<IdentityHeader>)var5.getCachedObject();
      }
   }

   private <UT extends User, GT extends Group, GMT extends GroupManager<UT, GT>> Set<IdentityHeader> a(
      User var1, GroupCache.CacheKey var2, IdentityProvider<UT, ?, ?, GMT> var3, boolean var4
   ) throws ValidationException {
      User var5;
      if (var1 instanceof UserBean) {
         var5 = var3.getUserManager().reify((UserBean)var1);
      } else {
         var5 = var1;
      }

      try {
         if (!var4) {
            var3.validate(var5);
         }
      } catch (FindException var11) {
         throw a(var11);
      }

      GroupManager var6 = var3.getGroupManager();

      Set var7;
      try {
         var7 = var6.getGroupHeaders(var5);
      } catch (FindException var10) {
         Logger var10000 = a;
         Level var10001 = Level.WARNING;
         String var10002 = var5.getId();
         String var10003 = ExceptionUtils.getMessage(var10);
         String[] var9 = f;
         var10000.log(var10001, var9[5] + var10002 + var9[2] + var10003 + var9[0], var10);
         throw new ValidationException(var9[7] + var5.getId() + var9[1]);
      }

      return this.a(var2, var3, Either.left(var5), var7);
   }

   private <UT extends User, GT extends Group, GMT extends GroupManager<UT, GT>> Set<IdentityHeader> a(
      Group var1, GroupCache.CacheKey var2, IdentityProvider<UT, ?, ?, GMT> var3
   ) throws FindException {
      Group var4;
      if (var1 instanceof GroupBean) {
         var4 = var3.getGroupManager().reify((GroupBean)var1);
      } else {
         var4 = var1;
      }

      GroupManager var5 = var3.getGroupManager();
      Set var6 = var5.getGroupHeadersForNestedGroup(var1.getId());
      return this.a(var2, var3, Either.right(var4), var6);
   }

   private <UT extends User, GT extends Group, GMT extends GroupManager<UT, ?>> Set<IdentityHeader> a(
      GroupCache.CacheKey var1, IdentityProvider<UT, ?, ?, GMT> var2, Either<UT, GT> var3, Set<IdentityHeader> var4
   ) {
      if (var4 == null) {
         return null;
      }

      int var5 = this.c.get();
      HashSet var6 = new HashSet();
      int var7 = 1;
      String var8 = null;
      if (var3.isLeft()) {
         var8 = ((User)var3.left()).getLogin();
      } else {
         var8 = ((Group)var3.right()).getName();
      }

      for (IdentityHeader var10 : var4) {
         if (var7 > var5) {
            String[] var11 = f;
            a.log(Level.INFO, var11[3] + var8 + var11[8] + var5);
            break;
         }

         var6.add(var10);
         var7++;
      }

      CacheEntry var13 = new CacheEntry<>(var6);
      this.e.store(var1, var13);
      if (a.isLoggable(Level.FINE)) {
         a.log(Level.FINE, f[9], new String[]{var8, var2.getConfig().getName()});
      }

      return var6;
   }

   void a() {
      WhirlycacheFactory.shutdown(this.e);
   }

   static {
      String[] var5 = new String[10];
      int var3 = 0;
      String var2 = "#M\u0002#M\u0012#Ok$YQ#vC&$XP-c\u0006kf)G\u0002;1BM+$\u00049.^Sli\u0006&#NQ?l\n;aML>$\u00168$Y\f+v\f>1\u000b\u0004FG\u0002()N\u0003)|\u0013\"3R\u0003*k\u0011k4XF>+\u00049.^Sl\u007fS6aBPlw\u0017*-N\u0003#jC\u0002%{\u0003n\u007fR6c\u0010\u0003;m\u000f'aYF:e\u000f\"%JW)!A\u00119.Y\u0003-g\u0000.2XJ\"cC,3DV<wC-.Y\u00039w\u00069a\f+G\u0002()N\u0003$m\u0017k'DQlq\u0010.3\u0004D>k\u0016;aP\u00131$\u00059.F\u0003\u0005`3kcP\u00121&!A\u00119.Y\u0003-g\u0000.2XJ\"cC,3DV<wC-.Y\u00039w\u00069a\f";
      int var4 = "#M\u0002#M\u0012#Ok$YQ#vC&$XP-c\u0006kf)G\u0002;1BM+$\u00049.^Sli\u0006&#NQ?l\n;aML>$\u00168$Y\f+v\f>1\u000b\u0004FG\u0002()N\u0003)|\u0013\"3R\u0003*k\u0011k4XF>+\u00049.^Sl\u007fS6aBPlw\u0017*-N\u0003#jC\u0002%{\u0003n\u007fR6c\u0010\u0003;m\u000f'aYF:e\u000f\"%JW)!A\u00119.Y\u0003-g\u0000.2XJ\"cC,3DV<wC-.Y\u00039w\u00069a\f+G\u0002()N\u0003$m\u0017k'DQlq\u0010.3\u0004D>k\u0016;aP\u00131$\u00059.F\u0003\u0005`3kcP\u00121&!A\u00119.Y\u0003-g\u0000.2XJ\"cC,3DV<wC-.Y\u00039w\u00069a\f"
         .length();
      char var1 = 2;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 97;
         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(GroupCache.class.getName());
                     return;
                  }

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

                  var2 = "d\u0004mrLB\u0000Eon\t\u0000+$Vcs\u001cDf&Inc\u001e\u0017c*T,v\u001e\re M|g\u0000\u0017+%K~&\u0019\u0017n1\u000bkt\u0003\u0011{c_<{L\u000becmhVLFprY.";
                  var4 = "d\u0004mrLB\u0000Eon\t\u0000+$Vcs\u001cDf&Inc\u001e\u0017c*T,v\u001e\re M|g\u0000\u0017+%K~&\u0019\u0017n1\u000bkt\u0003\u0011{c_<{L\u000becmhVLFprY."
                     .length();
                  var1 = 5;
                  var7 = -1;
            }

            var10000 = 38;
            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] ^ 45);
      }

      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 -> 101;
            case 1 -> 2;
            case 2 -> 42;
            case 3 -> 32;
            case 4 -> 74;
            case 5 -> 66;
            default -> 45;
         });
      }

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

   public static class CacheKey {
      private int a = -1;
      private final Goid b;
      private final EntityType c;
      private final String d;

      public CacheKey(Goid var1, EntityType var2, String var3) {
         this.b = var1;
         this.c = var2;
         this.d = var3;
      }

      @Override
      public boolean equals(Object var1) {
         if (this == var1) {
            return true;
         }

         if (var1 != null && this.getClass() == var1.getClass()) {
            GroupCache.CacheKey var2 = (GroupCache.CacheKey)var1;
            if (this.b != null ? this.b.equals(var2.b) : var2.b == null) {
               if (this.c != var2.c) {
                  return false;
               } else {
                  return this.d != null ? this.d.equals(var2.d) : var2.d == null;
               }
            } else {
               return false;
            }
         } else {
            return false;
         }
      }

      @Override
      public int hashCode() {
         if (this.a == -1) {
            int var1 = this.b != null ? this.b.hashCode() : 0;
            var1 = 31 * var1 + (this.c != null ? this.c.hashCode() : 0);
            var1 = 31 * var1 + (this.d != null ? this.d.hashCode() : 0);
            this.a = var1;
         }

         return this.a;
      }
   }
}
