package mapped;

import java.io.EOFException;
import java.io.IOException;
import net.runelite.mapping.ObfuscatedGetter;
import net.runelite.mapping.ObfuscatedName;
import net.runelite.mapping.ObfuscatedSignature;
import net.runelite.rs.api.RSBufferedFile;

@ObfuscatedName("tr")
public class BufferedFile implements RSBufferedFile {
   @ObfuscatedName("ah")
   @ObfuscatedSignature(
      descriptor = "Lto;"
   )
   AccessFile accessFile;
   @ObfuscatedName("ar")
   byte[] readBuffer;
   @ObfuscatedName("ao")
   @ObfuscatedGetter(
      longValue = 4117951487655605051L
   )
   long readBufferOffset;
   @ObfuscatedName("ab")
   @ObfuscatedGetter(
      intValue = -10484899
   )
   int readBufferLength;
   @ObfuscatedName("au")
   byte[] writeBuffer;
   @ObfuscatedName("aa")
   @ObfuscatedGetter(
      longValue = 1992700537634502431L
   )
   long writeBufferOffset;
   @ObfuscatedName("ac")
   @ObfuscatedGetter(
      intValue = -1929201209
   )
   int writeBufferLength;
   @ObfuscatedName("al")
   @ObfuscatedGetter(
      longValue = 4790383159447965731L
   )
   long offset;
   @ObfuscatedName("az")
   @ObfuscatedGetter(
      longValue = 8103128890163781175L
   )
   long fileLength;
   @ObfuscatedName("ap")
   @ObfuscatedGetter(
      longValue = -8017727714808881357L
   )
   long length;
   @ObfuscatedName("av")
   @ObfuscatedGetter(
      longValue = 8188367768124408955L
   )
   long fileOffset;

   @ObfuscatedSignature(
      descriptor = "(Lto;II)V"
   )
   public BufferedFile(AccessFile var1, int var2, int var3) throws IOException {
      this.readBufferOffset = -1L;
      this.writeBufferOffset = -1L;
      this.writeBufferLength = 0;
      this.accessFile = var1;
      this.length = this.fileLength = var1.length_base();
      this.readBuffer = new byte[var2];
      this.writeBuffer = new byte[var3];
      this.offset = 0L;
   }

   @ObfuscatedName("at")
   @ObfuscatedSignature(
      descriptor = "(B)V",
      garbageValue = "4"
   )
   public void close_base() throws IOException {
      this.flush_base();
      this.accessFile.close_base();
   }

   @ObfuscatedName("ah")
   public void seek_base(long var1) throws IOException {
      if(var1 < 0L) {
         throw new IOException("");
      } else {
         this.offset = var1;
      }
   }

   @ObfuscatedName("ar")
   @ObfuscatedSignature(
      descriptor = "(I)J",
      garbageValue = "-955462674"
   )
   public long length_base() {
      return this.length;
   }

   @ObfuscatedName("ao")
   @ObfuscatedSignature(
      descriptor = "([BB)V",
      garbageValue = "0"
   )
   public void readFully_base(byte[] var1) throws IOException {
      this.read_base(var1, 0, var1.length);
   }

   @ObfuscatedName("ab")
   @ObfuscatedSignature(
      descriptor = "([BIII)V",
      garbageValue = "1020211310"
   )
   public void read_base(byte[] var1, int var2, int var3) throws IOException {
      label140: {
         try {
            if(var3 + var2 > var1.length) {
               throw new ArrayIndexOutOfBoundsException(var3 + var2 - var1.length);
            }

            if(this.writeBufferOffset == -1L || this.offset < this.writeBufferOffset || this.offset + (long)var3 > this.writeBufferOffset + (long)this.writeBufferLength) {
               long var4 = this.offset;
               int var7 = var3;
               int var8;
               if(this.offset >= this.readBufferOffset && this.offset < this.readBufferOffset + (long)this.readBufferLength) {
                  var8 = (int)((long)this.readBufferLength - (this.offset - this.readBufferOffset));
                  if(var8 > var3) {
                     var8 = var3;
                  }

                  System.arraycopy(this.readBuffer, (int)(this.offset - this.readBufferOffset), var1, var2, var8);
                  this.offset += (long)var8;
                  var2 += var8;
                  var3 -= var8;
               }

               if(var3 > this.readBuffer.length) {
                  this.accessFile.seek_base(this.offset);

                  for(this.fileOffset = this.offset; var3 > 0; var3 -= var8) {
                     var8 = this.accessFile.read_base(var1, var2, var3);
                     if(var8 == -1) {
                        break;
                     }

                     this.fileOffset += (long)var8;
                     this.offset += (long)var8;
                     var2 += var8;
                  }
               } else if(var3 > 0) {
                  this.load_base();
                  var8 = var3;
                  if(var3 > this.readBufferLength) {
                     var8 = this.readBufferLength;
                  }

                  System.arraycopy(this.readBuffer, 0, var1, var2, var8);
                  var2 += var8;
                  var3 -= var8;
                  this.offset += (long)var8;
               }

               if(-1L == this.writeBufferOffset) {
                  break label140;
               }

               if(this.writeBufferOffset > this.offset && var3 > 0) {
                  var8 = var2 + (int)(this.writeBufferOffset - this.offset);
                  if(var8 > var3 + var2) {
                     var8 = var3 + var2;
                  }

                  while(var2 < var8) {
                     var1[var2++] = 0;
                     --var3;
                     ++this.offset;
                  }
               }

               long var13 = -1L;
               long var10 = -1L;
               if(this.writeBufferOffset >= var4 && this.writeBufferOffset < var4 + (long)var7) {
                  var13 = this.writeBufferOffset;
               } else if(var4 >= this.writeBufferOffset && var4 < this.writeBufferOffset + (long)this.writeBufferLength) {
                  var13 = var4;
               }

               if(this.writeBufferOffset + (long)this.writeBufferLength > var4 && this.writeBufferOffset + (long)this.writeBufferLength <= (long)var7 + var4) {
                  var10 = (long)this.writeBufferLength + this.writeBufferOffset;
               } else if(var4 + (long)var7 > this.writeBufferOffset && var4 + (long)var7 <= (long)this.writeBufferLength + this.writeBufferOffset) {
                  var10 = var4 + (long)var7;
               }

               if(var13 > -1L && var10 > var13) {
                  int var12 = (int)(var10 - var13);
                  System.arraycopy(this.writeBuffer, (int)(var13 - this.writeBufferOffset), var1, (int)(var13 - var4) + var2, var12);
                  if(var10 > this.offset) {
                     var3 = (int)((long)var3 - (var10 - this.offset));
                     this.offset = var10;
                  }
               }
               break label140;
            }

            System.arraycopy(this.writeBuffer, (int)(this.offset - this.writeBufferOffset), var1, var2, var3);
            this.offset += (long)var3;
         } catch (IOException var16) {
            this.fileOffset = -1L;
            throw var16;
         }

         return;
      }

      if(var3 > 0) {
         throw new EOFException();
      }
   }

   @ObfuscatedName("au")
   @ObfuscatedSignature(
      descriptor = "(B)V",
      garbageValue = "16"
   )
   void load_base() throws IOException {
      this.readBufferLength = 0;
      if(this.fileOffset != this.offset) {
         this.accessFile.seek_base(this.offset);
         this.fileOffset = this.offset;
      }

      int var2;
      for(this.readBufferOffset = this.offset; this.readBufferLength < this.readBuffer.length; this.readBufferLength += var2) {
         int var1 = this.readBuffer.length - this.readBufferLength;
         if(var1 > 200000000) {
            var1 = 200000000;
         }

         var2 = this.accessFile.read_base(this.readBuffer, this.readBufferLength, var1);
         if(var2 == -1) {
            break;
         }

         this.fileOffset += (long)var2;
      }

   }

   @ObfuscatedName("aa")
   @ObfuscatedSignature(
      descriptor = "([BIII)V",
      garbageValue = "267822914"
   )
   public void write_base(byte[] var1, int var2, int var3) throws IOException {
      try {
         if((long)var3 + this.offset > this.length) {
            this.length = this.offset + (long)var3;
         }

         if(this.writeBufferOffset != -1L && (this.offset < this.writeBufferOffset || this.offset > (long)this.writeBufferLength + this.writeBufferOffset)) {
            this.flush_base();
         }

         if(-1L != this.writeBufferOffset && (long)var3 + this.offset > (long)this.writeBuffer.length + this.writeBufferOffset) {
            int var4 = (int)((long)this.writeBuffer.length - (this.offset - this.writeBufferOffset));
            System.arraycopy(var1, var2, this.writeBuffer, (int)(this.offset - this.writeBufferOffset), var4);
            this.offset += (long)var4;
            var2 += var4;
            var3 -= var4;
            this.writeBufferLength = this.writeBuffer.length;
            this.flush_base();
         }

         if(var3 <= this.writeBuffer.length) {
            if(var3 > 0) {
               if(this.writeBufferOffset == -1L) {
                  this.writeBufferOffset = this.offset;
               }

               System.arraycopy(var1, var2, this.writeBuffer, (int)(this.offset - this.writeBufferOffset), var3);
               this.offset += (long)var3;
               if(this.offset - this.writeBufferOffset > (long)this.writeBufferLength) {
                  this.writeBufferLength = (int)(this.offset - this.writeBufferOffset);
               }

               return;
            }

            return;
         }

         if(this.fileOffset != this.offset) {
            this.accessFile.seek_base(this.offset);
            this.fileOffset = this.offset;
         }

         this.accessFile.write_base(var1, var2, var3);
         this.fileOffset += (long)var3;
         if(this.fileOffset > this.fileLength) {
            this.fileLength = this.fileOffset;
         }

         long var9 = -1L;
         long var6 = -1L;
         if(this.offset >= this.readBufferOffset && this.offset < this.readBufferOffset + (long)this.readBufferLength) {
            var9 = this.offset;
         } else if(this.readBufferOffset >= this.offset && this.readBufferOffset < this.offset + (long)var3) {
            var9 = this.readBufferOffset;
         }

         if((long)var3 + this.offset > this.readBufferOffset && (long)var3 + this.offset <= this.readBufferOffset + (long)this.readBufferLength) {
            var6 = (long)var3 + this.offset;
         } else if(this.readBufferOffset + (long)this.readBufferLength > this.offset && (long)this.readBufferLength + this.readBufferOffset <= this.offset + (long)var3) {
            var6 = (long)this.readBufferLength + this.readBufferOffset;
         }

         if(var9 > -1L && var6 > var9) {
            int var8 = (int)(var6 - var9);
            System.arraycopy(var1, (int)((long)var2 + var9 - this.offset), this.readBuffer, (int)(var9 - this.readBufferOffset), var8);
         }

         this.offset += (long)var3;
      } catch (IOException var12) {
         this.fileOffset = -1L;
         throw var12;
      }

   }

   @ObfuscatedName("ac")
   @ObfuscatedSignature(
      descriptor = "(I)V",
      garbageValue = "16711680"
   )
   void flush_base() throws IOException {
      if(this.writeBufferOffset != -1L) {
         if(this.writeBufferOffset != this.fileOffset) {
            this.accessFile.seek_base(this.writeBufferOffset);
            this.fileOffset = this.writeBufferOffset;
         }

         this.accessFile.write_base(this.writeBuffer, 0, this.writeBufferLength);
         this.fileOffset += (long)(this.writeBufferLength * 1474508791) * -1929201209L;
         if(this.fileOffset > this.fileLength) {
            this.fileLength = this.fileOffset;
         }

         long var1 = -1L;
         long var3 = -1L;
         if(this.writeBufferOffset >= this.readBufferOffset && this.writeBufferOffset < (long)this.readBufferLength + this.readBufferOffset) {
            var1 = this.writeBufferOffset;
         } else if(this.readBufferOffset >= this.writeBufferOffset && this.readBufferOffset < (long)this.writeBufferLength + this.writeBufferOffset) {
            var1 = this.readBufferOffset;
         }

         if((long)this.writeBufferLength + this.writeBufferOffset > this.readBufferOffset && (long)this.writeBufferLength + this.writeBufferOffset <= (long)this.readBufferLength + this.readBufferOffset) {
            var3 = (long)this.writeBufferLength + this.writeBufferOffset;
         } else if((long)this.readBufferLength + this.readBufferOffset > this.writeBufferOffset && this.readBufferOffset + (long)this.readBufferLength <= this.writeBufferOffset + (long)this.writeBufferLength) {
            var3 = this.readBufferOffset + (long)this.readBufferLength;
         }

         if(var1 > -1L && var3 > var1) {
            int var5 = (int)(var3 - var1);
            System.arraycopy(this.writeBuffer, (int)(var1 - this.writeBufferOffset), this.readBuffer, (int)(var1 - this.readBufferOffset), var5);
         }

         this.writeBufferOffset = -1L;
         this.writeBufferLength = 0;
      }

   }
}
