package com.l7tech.server.folder;

import com.l7tech.gateway.common.admin.FolderAdmin;
import com.l7tech.gateway.common.security.rbac.OperationType;
import com.l7tech.gateway.common.security.rbac.PermissionDeniedException;
import com.l7tech.identity.User;
import com.l7tech.objectmodel.ConstraintViolationException;
import com.l7tech.objectmodel.DeleteException;
import com.l7tech.objectmodel.DuplicateObjectException;
import com.l7tech.objectmodel.Entity;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.NonEmptyFolderDeletionException;
import com.l7tech.objectmodel.PersistentEntity;
import com.l7tech.objectmodel.SaveException;
import com.l7tech.objectmodel.UpdateException;
import com.l7tech.objectmodel.folder.Folder;
import com.l7tech.objectmodel.folder.FolderHeader;
import com.l7tech.objectmodel.folder.FolderedEntityManager;
import com.l7tech.objectmodel.folder.HasFolder;
import com.l7tech.server.security.rbac.RbacServices;
import com.l7tech.server.util.JaasUtils;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.Functions.Binary;
import java.util.Collection;
import java.util.Map;
import org.jetbrains.annotations.NotNull;

public class FolderAdminImpl implements FolderAdmin {
   private static final int a = 128;
   private static final int b;
   private final FolderManager c;
   private final Map<Class<? extends Entity>, FolderedEntityManager> d;
   private final RbacServices e;
   private static final String[] f;

   public FolderAdminImpl(FolderManager var1, Map<Class<? extends Entity>, FolderedEntityManager> var2, @NotNull RbacServices var3) {
      if (var3 == null) {
         a(0);
      }

      super();
      this.c = var1;
      this.d = var2;
      this.e = var3;
   }

   public void deleteFolder(Goid var1) throws FindException, DeleteException {
      for (FolderedEntityManager var3 : this.d.values()) {
         Collection var4 = var3.findByFolder(var1);

         try {
            if (!var4.isEmpty()) {
               throw new NonEmptyFolderDeletionException(f[9] + var1 + f[5]);
            }
         } catch (FindException var5) {
            throw a(var5);
         }
      }

      this.c.delete(var1);
   }

   public Folder findByPrimaryKey(Goid var1) throws FindException {
      return (Folder)this.c.findByPrimaryKey(var1);
   }

   public Collection<FolderHeader> findAllFolders() throws FindException {
      return this.c.findAllHeaders();
   }

   public Goid saveFolder(Folder var1) throws UpdateException, SaveException, ConstraintViolationException {
      String var2 = var1.getName();

      label67: {
         try {
            if (var2 == null || var2.length() <= 128) {
               break label67;
            }
         } catch (SaveException var15) {
            throw a(var15);
         }

         String[] var8 = f;
         String var3 = var8[4];

         try {
            if (Goid.isDefault(var1.getGoid())) {
               throw new SaveException(var3);
            }
         } catch (SaveException var14) {
            throw a(var14);
         }

         throw new UpdateException(var3);
      }

      try {
         Folder var4 = this.c.findRootFolder();
         Goid var17;
         if (Goid.isDefault(var1.getGoid())) {
            Folder var5 = (Folder)this.c.findByPrimaryKey(var1.getFolder().getGoid());
            int var6 = b - var4.getNesting(var5);
            this.a(var1, var6, 1, new a(this));
            var17 = this.c.save(var1);
            var1.setGoid(var17);

            try {
               this.c.createRoles(var1);
            } catch (SaveException var9) {
               String[] var19 = f;
               throw new SaveException(var19[26], var9);
            }
         } else {
            this.c.update(var1);
            this.c.updateRoles(var1);
            var17 = var1.getGoid();
         }

         return var17;
      } catch (DuplicateObjectException var11) {
         String[] var18 = f;
         throw new ConstraintViolationException(var18[7], var11);
      } catch (UpdateException var12) {
         UpdateException var16 = var12;

         try {
            if (ExceptionUtils.causedBy(var16, DuplicateObjectException.class)) {
               throw new ConstraintViolationException(f[10], var16);
            }
         } catch (SaveException var10) {
            throw a(var10);
         }

         throw var12;
      } catch (FindException var13) {
         throw new SaveException(f[20], var13);
      }
   }

   public void moveEntityToFolder(Folder var1, PersistentEntity var2) throws UpdateException {
      try {
         if (var2 == null) {
            throw new UpdateException(f[16]);
         }
      } catch (FindException var16) {
         throw a(var16);
      }

      Folder var3;
      try {
         var3 = this.c.findRootFolder();
      } catch (FindException var12) {
         String[] var9 = f;
         throw new UpdateException(var9[24], var12);
      }

      Folder var10000;
      label71: {
         try {
            if (var1 != null) {
               var10000 = var1;
               break label71;
            }
         } catch (FindException var15) {
            throw a(var15);
         }

         var10000 = var3;
      }

      Folder var4 = var10000;

      try {
         if (Goid.equals(var2.getGoid(), var4.getGoid())) {
            throw new UpdateException(f[21], null);
         }
      } catch (FindException var11) {
         throw a(var11);
      }

      if (var2 instanceof Folder) {
         try {
            try {
               if (((Folder)var2).isParentOf(var4)) {
                  throw new UpdateException(f[25]);
               }
            } catch (FindException var13) {
               throw a(var13);
            }

            int var5 = b - var3.getNesting(var4);

            for (Folder var7 : this.c.findAll()) {
               int var8 = ((Folder)var2).getNesting(var7);

               try {
                  if (var8 >= 0) {
                     this.a(var7, var5, var8 + 1, new b(this));
                  }
               } catch (FindException var10) {
                  throw a(var10);
               }
            }
         } catch (FindException var14) {
            throw new UpdateException(f[19], var14);
         }
      }

      this.a(var2, var4);
      FolderedEntityManager var17 = this.d.get(var2.getClass());
      var17.updateFolder(var2, var4);
   }

   private void a(@NotNull PersistentEntity var1, @NotNull Folder var2) throws UpdateException {
      try {
         if (var1 == null) {
            a(1);
         }
      } catch (FindException var8) {
         throw a(var8);
      }

      try {
         if (var2 == null) {
            a(2);
         }
      } catch (FindException var11) {
         throw a(var11);
      }

      User var3 = JaasUtils.getCurrentUser();

      try {
         try {
            if (!this.e.isPermittedForEntity(var3, var2, OperationType.UPDATE, null)) {
               throw new PermissionDeniedException(OperationType.UPDATE, var2, null);
            }
         } catch (FindException var7) {
            throw a(var7);
         }

         try {
            if (!this.e.isPermittedForEntity(var3, var1, OperationType.UPDATE, null)) {
               throw new PermissionDeniedException(OperationType.UPDATE, var1, null);
            }
         } catch (FindException var9) {
            throw a(var9);
         }

         if (var1 instanceof HasFolder var4) {
            Folder var5 = var4.getFolder();

            try {
               if (!this.e.isPermittedForEntity(var3, var5, OperationType.UPDATE, null)) {
                  throw new PermissionDeniedException(OperationType.UPDATE, var5, null);
               }
            } catch (FindException var6) {
               throw a(var6);
            }
         }
      } catch (FindException var10) {
         throw new UpdateException(f[0], var10);
      }
   }

   private <T extends Throwable> void a(Folder param1, int param2, int param3, Binary<T, String, Throwable> param4) throws T {
      // $VF: Couldn't be decompiled
      // 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!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 1
      // 01: invokevirtual com/l7tech/objectmodel/folder/Folder.getFolder ()Lcom/l7tech/objectmodel/folder/Folder;
      // 04: ifnull 15
      // 07: aload 1
      // 08: invokevirtual com/l7tech/objectmodel/folder/Folder.getFolder ()Lcom/l7tech/objectmodel/folder/Folder;
      // 0b: invokevirtual com/l7tech/objectmodel/folder/Folder.getGoid ()Lcom/l7tech/objectmodel/Goid;
      // 0e: goto 16
      // 11: invokestatic com/l7tech/server/folder/FolderAdminImpl.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 14: athrow
      // 15: aconst_null
      // 16: astore 5
      // 18: aload 5
      // 1a: ifnull a1
      // 1d: aload 5
      // 1f: aload 1
      // 20: invokevirtual com/l7tech/objectmodel/folder/Folder.getGoid ()Lcom/l7tech/objectmodel/Goid;
      // 23: invokestatic com/l7tech/objectmodel/Goid.equals (Lcom/l7tech/objectmodel/Goid;Lcom/l7tech/objectmodel/Goid;)Z
      // 26: ifeq 45
      // 29: goto 30
      // 2c: invokestatic com/l7tech/server/folder/FolderAdminImpl.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 2f: athrow
      // 30: aload 4
      // 32: getstatic com/l7tech/server/folder/FolderAdminImpl.f [Ljava/lang/String;
      // 35: bipush 3
      // 36: aaload
      // 37: aconst_null
      // 38: invokeinterface com/l7tech/util/Functions$Binary.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 3
      // 3d: checkcast java/lang/Throwable
      // 40: athrow
      // 41: invokestatic com/l7tech/server/folder/FolderAdminImpl.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 44: athrow
      // 45: iload 3
      // 46: iload 2
      // 47: if_icmple a1
      // 4a: aload 4
      // 4c: getstatic com/l7tech/server/folder/FolderAdminImpl.b I
      // 4f: iload 2
      // 50: iload 2
      // 51: bipush 1
      // 52: if_icmpne 69
      // 55: goto 5c
      // 58: invokestatic com/l7tech/server/folder/FolderAdminImpl.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 5b: athrow
      // 5c: getstatic com/l7tech/server/folder/FolderAdminImpl.f [Ljava/lang/String;
      // 5f: bipush 17
      // 61: aaload
      // 62: goto 72
      // 65: invokestatic com/l7tech/server/folder/FolderAdminImpl.a (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 68: athrow
      // 69: getstatic com/l7tech/server/folder/FolderAdminImpl.f [Ljava/lang/String;
      // 6c: astore 9
      // 6e: aload 9
      // 70: bipush 1
      // 71: aaload
      // 72: astore 6
      // 74: istore 7
      // 76: istore 8
      // 78: getstatic com/l7tech/server/folder/FolderAdminImpl.f [Ljava/lang/String;
      // 7b: astore 9
      // 7d: aload 9
      // 7f: bipush 23
      // 81: aaload
      // 82: iload 8
      // 84: aload 9
      // 86: bipush 13
      // 88: aaload
      // 89: iload 7
      // 8b: aload 6
      // 8d: aload 9
      // 8f: bipush 8
      // 91: aaload
      // 92: invokedynamic makeConcatWithConstants (Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)Ljava/lang/String; bsm=java/lang/invoke/StringConcatFactory.makeConcatWithConstants (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; args=[ "\u0001\u0001\u0001\u0001\u0001\u0001" ]
      // 97: aconst_null
      // 98: invokeinterface com/l7tech/util/Functions$Binary.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; 3
      // 9d: checkcast java/lang/Throwable
      // a0: athrow
      // a1: return
      // try (0 -> 7): 7 java/lang/Throwable
      // try (11 -> 18): 19 java/lang/Throwable
      // try (13 -> 29): 29 java/lang/Throwable
      // try (31 -> 40): 41 java/lang/Throwable
      // try (34 -> 47): 47 java/lang/Throwable
   }

   static {
      String[] var5 = new String[27];
      int var3 = 0;
      String var2 = "zI\u0019^,BG[HX_(B\u0004D\u0007\n^!DG_B\nQ)T\u0014FH\u0016O`A\b]\u0007\u0015S6N\tH\u0007\u001dR4N\u0013V\u0007\fS`F\t@S\u0010Y2\u0007\u0001@K\u001cY2\t\u0007\u000fK\u001dJ%K\u0014\f[F\n[%S!@K\u001cY2-\u007fF\nY.SGIH\u0014X%UGLF\u0016R/SGMBXH(BG\\F\u0015Y`F\u0014\u000fA\u0017P$B\u0015\u000fN\u001c(iH\u0014X%UGAF\u0015Y`D\u0006AI\u0017H`B\u001fLB\u001dX`\u0016U\u0017\u0007\u001bT!U\u0006LS\u001dN3\r\u000fN\u000b\u001c.H\u0013\u000fB\u0015L4^\f]E\u0019_\u0013B\u0015YN\u001bY3\u001aiH\u0014X%UGAF\u0015Y`F\u000b]B\u0019X9\u0007\u0002WN\u000bH3\u0006\u000fC\u001dY0\t\u0011iH\u0014X%UGXN\fT`@\bFCX\u001aiH\u0014X%UGAF\u0015Y`F\u000b]B\u0019X9\u0007\u0002WN\u000bH3\u0006\u0013N\u0016U4\u0019(LH\u0015\u0013,\u0010\u0013JD\u0010\u00133B\u0015YB\n\u0013&H\u000bKB\n\u0013\u0006H\u000bKB\n}$J\u000eAn\u0015L,6\u0001-,]2@\u0002[\u0007\u001eS,C\u0002]\u0007\u001b].\u0007\u0006LD\u001dL4\u0007\u0006\u000fA\u0017P$B\u0015\u000fO\u0011Y2F\u0015LO\u0001\u001c!SGBH\u000bH`!_H\u0014U#^\b]@\u0019R)]\u0006[N\u0017RnJ\u0006Wa\u0017P$B\u0015kB\bH(\u0006JI\fU4^\u0013jI\fU4^GFTXN%V\u0012FU\u001dXn\u0006\u000fK\u001dJ%K>nU\u001fI-B\t[\u0007\u001eS2\u0007'aH\fr5K\u000b\u000fW\u0019N!J\u0002[B\n\u001cg\u0002\u0014\b\u0007\u0017Z`\u0002\u0014\u0001\u0002\u000b\u001c-R\u0014[\u0007\u0016S4\u0007\u0005J\u0007\u0016I,K\u001flH\rP$\u0007\t@SXN%S\u0015FB\u000eY`A\bCC\u001dN`K\u000e\\SV\u0017jU\nS2\u0007\u0001FI\u001cU.@GN\u0007\u001eS,C\u0002]\t-\u007fF\nY.SGIH\u0014X%UGLF\u0016R/SGMBXH(BG\\F\u0015Y`F\u0014\u000fA\u0017P$B\u0015\u000fN\u001c\u001aLO\u001d_+j\bYB=R4N\u0013Vw\u001dN-N\u0014\\N\u0017R3\u001c{O\u001d\u001c-F\u001fFJ\rQ`A\bCC\u001dN`C\u0002_S\u0010\u001c)TG\u001ajU\nS2\u0007\u0001FI\u001cU.@G]H\u0017H`A\bCC\u001dNn";
      int var4 = "zI\u0019^,BG[HX_(B\u0004D\u0007\n^!DG_B\nQ)T\u0014FH\u0016O`A\b]\u0007\u0015S6N\tH\u0007\u001dR4N\u0013V\u0007\fS`F\t@S\u0010Y2\u0007\u0001@K\u001cY2\t\u0007\u000fK\u001dJ%K\u0014\f[F\n[%S!@K\u001cY2-\u007fF\nY.SGIH\u0014X%UGLF\u0016R/SGMBXH(BG\\F\u0015Y`F\u0014\u000fA\u0017P$B\u0015\u000fN\u001c(iH\u0014X%UGAF\u0015Y`D\u0006AI\u0017H`B\u001fLB\u001dX`\u0016U\u0017\u0007\u001bT!U\u0006LS\u001dN3\r\u000fN\u000b\u001c.H\u0013\u000fB\u0015L4^\f]E\u0019_\u0013B\u0015YN\u001bY3\u001aiH\u0014X%UGAF\u0015Y`F\u000b]B\u0019X9\u0007\u0002WN\u000bH3\u0006\u000fC\u001dY0\t\u0011iH\u0014X%UGXN\fT`@\bFCX\u001aiH\u0014X%UGAF\u0015Y`F\u000b]B\u0019X9\u0007\u0002WN\u000bH3\u0006\u0013N\u0016U4\u0019(LH\u0015\u0013,\u0010\u0013JD\u0010\u00133B\u0015YB\n\u0013&H\u000bKB\n\u0013\u0006H\u000bKB\n}$J\u000eAn\u0015L,6\u0001-,]2@\u0002[\u0007\u001eS,C\u0002]\u0007\u001b].\u0007\u0006LD\u001dL4\u0007\u0006\u000fA\u0017P$B\u0015\u000fO\u0011Y2F\u0015LO\u0001\u001c!SGBH\u000bH`!_H\u0014U#^\b]@\u0019R)]\u0006[N\u0017RnJ\u0006Wa\u0017P$B\u0015kB\bH(\u0006JI\fU4^\u0013jI\fU4^GFTXN%V\u0012FU\u001dXn\u0006\u000fK\u001dJ%K>nU\u001fI-B\t[\u0007\u001eS2\u0007'aH\fr5K\u000b\u000fW\u0019N!J\u0002[B\n\u001cg\u0002\u0014\b\u0007\u0017Z`\u0002\u0014\u0001\u0002\u000b\u001c-R\u0014[\u0007\u0016S4\u0007\u0005J\u0007\u0016I,K\u001flH\rP$\u0007\t@SXN%S\u0015FB\u000eY`A\bCC\u001dN`K\u000e\\SV\u0017jU\nS2\u0007\u0001FI\u001cU.@GN\u0007\u001eS,C\u0002]\t-\u007fF\nY.SGIH\u0014X%UGLF\u0016R/SGMBXH(BG\\F\u0015Y`F\u0014\u000fA\u0017P$B\u0015\u000fN\u001c\u001aLO\u001d_+j\bYB=R4N\u0013Vw\u001dN-N\u0014\\N\u0017R3\u001c{O\u001d\u001c-F\u001fFJ\rQ`A\bCC\u001dN`C\u0002_S\u0010\u001c)TG\u001ajU\nS2\u0007\u0001FI\u001cU.@G]H\u0017H`A\bCC\u001dNn"
         .length();
      char var1 = 'E';
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 94;
         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;
                     b = ConfigFactory.getIntProperty(f[14], 8);
                     return;
                  }

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

                  var2 = "\u000b?mlT2d+>f-D>x1wn#\\3r-wa?\u001067,\"j*_;s:%(#Vwc72(?_\"e<2(*_;s:%\u001f\u001a%z#Bwt-2i8Y9p\u007f\u0005g Uwq0%(\n_;s:%&";
                  var4 = "\u000b?mlT2d+>f-D>x1wn#\\3r-wa?\u001067,\"j*_;s:%(#Vwc72(?_\"e<2(*_;s:%\u001f\u001a%z#Bwt-2i8Y9p\u007f\u0005g Uwq0%(\n_;s:%&"
                     .length();
                  var1 = ':';
                  var7 = -1;
            }

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

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

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

      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 -> 113;
            case 1 -> 121;
            case 2 -> 38;
            case 3 -> 98;
            case 4 -> 30;
            case 5 -> 121;
            default -> 57;
         });
      }

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