package com.l7tech.objectmodel.folder;

import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.imp.ZoneableNamedEntityImp;
import com.l7tech.objectmodel.migration.Migration;
import com.l7tech.objectmodel.migration.MigrationMappingSelection;
import com.l7tech.security.rbac.RbacAttribute;
import com.l7tech.util.DeserializeSafe;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.XmlRootElement;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.annotations.Proxy;

@XmlRootElement
@Entity
@Proxy(lazy = false)
@Table(name = "folder")
@DeserializeSafe
public class Folder extends ZoneableNamedEntityImp implements HasFolder {
   private Folder parentFolder;
   private static final int MAX_NESTING_CHECK_LEVEL = 1000;
   public static final Goid ROOT_FOLDER_ID;
   static final long serialVersionUID = 8184082268533628807L;
   private static final String[] b;

   public Folder(String var1, Folder var2) {
      this._name = var1;
      this.parentFolder = var2;
   }

   public Folder(Folder var1) {
      super(var1);
      this.parentFolder = var1.getFolder();
   }

   @Deprecated
   @Override
   public void setId(String var1) {
      this.checkLocked();
      if (b[0].equals(var1)) {
         this.setGoid(ROOT_FOLDER_ID);
      } else {
         super.setId(var1);
      }
   }

   public Folder(Folder var1, boolean var2) {
      this(var1);
      if (var2) {
         this.lock();
      }
   }

   @Deprecated
   public Folder() {
   }

   @RbacAttribute
   @Size(min = 1, max = 128)
   @Transient
   @Override
   public String getName() {
      return super.getName();
   }

   @NotNull
   @Migration(mapName = MigrationMappingSelection.NONE, mapValue = MigrationMappingSelection.NONE)
   @ManyToOne
   @JoinColumn(name = "parent_folder_goid")
   @Override
   public Folder getFolder() {
      return this.parentFolder;
   }

   @Deprecated
   @Override
   public void setFolder(Folder var1) {
      this.checkLocked();
      this.parentFolder = var1;
   }

   public void reParent(Folder param1) throws InvalidParentFolderException {
      // $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 0
      // 01: invokevirtual com/l7tech/objectmodel/folder/Folder.checkLocked ()V
      // 04: aload 1
      // 05: invokevirtual com/l7tech/objectmodel/folder/Folder.getGoid ()Lcom/l7tech/objectmodel/Goid;
      // 08: aload 0
      // 09: invokevirtual com/l7tech/objectmodel/folder/Folder.getGoid ()Lcom/l7tech/objectmodel/Goid;
      // 0c: invokestatic com/l7tech/objectmodel/Goid.equals (Lcom/l7tech/objectmodel/Goid;Lcom/l7tech/objectmodel/Goid;)Z
      // 0f: ifne 21
      // 12: aload 0
      // 13: aload 1
      // 14: invokevirtual com/l7tech/objectmodel/folder/Folder.isParentOf (Lcom/l7tech/objectmodel/folder/Folder;)Z
      // 17: ifeq 32
      // 1a: goto 21
      // 1d: invokestatic com/l7tech/objectmodel/folder/Folder.a (Lcom/l7tech/objectmodel/folder/InvalidParentFolderException;)Lcom/l7tech/objectmodel/folder/InvalidParentFolderException;
      // 20: athrow
      // 21: new com/l7tech/objectmodel/folder/InvalidParentFolderException
      // 24: dup
      // 25: getstatic com/l7tech/objectmodel/folder/Folder.b [Ljava/lang/String;
      // 28: bipush 1
      // 29: aaload
      // 2a: invokespecial com/l7tech/objectmodel/folder/InvalidParentFolderException.<init> (Ljava/lang/String;)V
      // 2d: athrow
      // 2e: invokestatic com/l7tech/objectmodel/folder/Folder.a (Lcom/l7tech/objectmodel/folder/InvalidParentFolderException;)Lcom/l7tech/objectmodel/folder/InvalidParentFolderException;
      // 31: athrow
      // 32: aload 0
      // 33: aload 1
      // 34: putfield com/l7tech/objectmodel/folder/Folder.parentFolder Lcom/l7tech/objectmodel/folder/Folder;
      // 37: return
      // try (0 -> 12): 13 com/l7tech/objectmodel/folder/InvalidParentFolderException
      // try (8 -> 22): 22 com/l7tech/objectmodel/folder/InvalidParentFolderException
   }

   @Transient
   public boolean isParentOf(Folder var1) {
      return this.getNesting(var1) > 0;
   }

   @Transient
   public int getNesting(Folder var1) {
      if (var1 == null) {
         return -1;
      }

      if (Goid.equals(this.getGoid(), var1.getGoid())) {
         return 0;
      }

      int var2 = 0;

      for (Folder var3 = var1.getFolder(); var3 != null && var2++ < 1000; var3 = var3.getFolder()) {
         if (Goid.equals(var3.getGoid(), this.getGoid())) {
            return var2;
         }
      }

      return -1;
   }

   @Transient
   public String getPath() {
      if (this.parentFolder == null) {
         return "/";
      }

      StringBuilder var1 = new StringBuilder();
      Folder var2 = this;

      for (int var3 = 0; var2.getFolder() != null && var3++ < 1000; var2 = var2.getFolder()) {
         var1.append(new StringBuilder(var2.getName()).reverse()).append("/");
      }

      return var1.reverse().toString();
   }

   static {
      String[] var5 = new String[2];
      int var3 = 0;
      String var2 = "\u000b\u000fq\\\u000e:rR$LXS\tRS/\rH_\u0015H\u001a'\u0003PR\u001fT\u001a(\u001f\u001cWZUO#\nSZ\u001eCHa\u0003Z\u0016\u000eN_a\u001fSC\bE_a\nSZ\u001eCH";
      int var4 = "\u000b\u000fq\\\u000e:rR$LXS\tRS/\rH_\u0015H\u001a'\u0003PR\u001fT\u001a(\u001f\u001cWZUO#\nSZ\u001eCHa\u0003Z\u0016\u000eN_a\u001fSC\bE_a\nSZ\u001eCH"
         .length();
      char var1 = 5;
      int var0 = -1;

      while (true) {
         String var10002 = b(99, b(var2.substring(++var0, var0 + var1)));
         byte var10001 = -1;
         var5[var3++] = var10002;
         if ((var0 += var1) >= var4) {
            b = var5;
            ROOT_FOLDER_ID = new Goid(0L, -5002L);
            return;
         }

         var1 = var2.charAt(var0);
      }
   }

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

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

      return var10000;
   }

   private static String b(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 -> 69;
            case 1 -> 89;
            case 2 -> 34;
            case 3 -> 15;
            case 4 -> 95;
            case 5 -> 85;
            default -> 25;
         });
      }

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