package com.l7tech.external.assertions.gatewaygraphql.server.resolver;

import com.l7tech.common.mime.ContentTypeHeader;
import com.l7tech.common.mime.MimeHeader;
import com.l7tech.common.mime.NoSuchPartException;
import com.l7tech.common.mime.PartInfo;
import com.l7tech.common.mime.PartIterator;
import com.l7tech.util.IOUtils;
import jakarta.mail.internet.ContentDisposition;
import jakarta.mail.internet.ParseException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;

public class FilePartSupplier {
   private static final String a;
   private static final String b;
   private final Map<String, FilePart> c = new HashMap<>();
   private final List<Runnable> d = new ArrayList<>();
   private static final String[] e;

   public void populateRequestParts(PartIterator var1) {
      for (int var2 = 1; var1.hasNext(); var2++) {
         PartInfo var3 = var1.next();
         String[] var8 = e;
         MimeHeader var4 = var3.getHeader(var8[3]);
         ContentDisposition var5 = this.b(var4.getFullValue());
         String var6 = var5.getParameter(var8[1]);
         if (StringUtils.isEmpty(var6)) {
            var6 = String.valueOf(var2);
         }

         String var7 = var5.getParameter(e[6]);
         this.putRequestPart(var6, new FilePart(var6, var7, var3.getContentType().getType(), () -> {
            try {
               return var3.getInputStream(true);
            } catch (IOException | NoSuchPartException var2x) {
               throw new IllegalStateException(var2x);
            }
         }));
      }
   }

   public FilePart getRequestPart(String var1) {
      return this.c.get(e[5] + var1);
   }

   public FilePart getResponsePart(String var1) {
      return this.c.get(e[2] + var1);
   }

   public void putRequestPart(String var1, FilePart var2) {
      this.c.putIfAbsent(e[4] + var1, var2);
   }

   public void putResponsePart(String var1, FilePart var2) {
      this.c.putIfAbsent(e[0] + var1, var2);
   }

   public List<String> getRequestPartNames() {
      return this.a(e[4]);
   }

   public List<String> getResponsePartNames() {
      return this.a(e[2]);
   }

   public void cleanQuietly() {
      this.c.values().forEach(FilePart::closeQuietly);
      this.c.clear();
      this.d.forEach(Runnable::run);
      this.d.clear();
   }

   public void runOnClean(Runnable var1) {
      this.d.add(var1);
   }

   private List<String> a(String var1) {
      return this.c.keySet().stream().filter(var1x -> var1x.startsWith(var1)).map(var1x -> var1x.substring(var1.length())).collect(Collectors.toList());
   }

   private ContentDisposition b(String var1) {
      try {
         return new ContentDisposition(var1);
      } catch (ParseException var3) {
         throw new IllegalStateException(var3);
      }
   }

   static {
      String[] var5 = new String[7];
      int var3 = 0;
      String var2 = "\u0004\fYn\u0011\u0004\u0018\bG{\u0005\u0004\fYn\u0011\u00135\u0006DjZZ\u0004[-CmO[\u0003\u001f\u001dCqQ\u0004\u0004\f[0";
      int var4 = "\u0004\fYn\u0011\u0004\u0018\bG{\u0005\u0004\fYn\u0011\u00135\u0006DjZZ\u0004[-CmO[\u0003\u001f\u001dCqQ\u0004\u0004\f[0".length();
      char var1 = 5;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 20;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = a(var10000, c(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     e = var5;
                     String[] var9 = e;
                     b = e[2];
                     a = var9[4];
                     return;
                  }

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

                  var2 = "*\"u\u001e\b>.hU\u007f{3=";
                  var4 = "*\"u\u001e\b>.hU\u007f{3=".length();
                  var1 = 4;
                  var7 = -1;
            }

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

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

      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 -> 98;
            case 1 -> 125;
            case 2 -> 62;
            case 3 -> 10;
            case 4 -> 43;
            case 5 -> 32;
            default -> 100;
         });
      }

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

   public static class MultiPartWriter {
      private final String a;
      private final byte[] b;
      private final ByteArrayOutputStream c;
      private static final String[] d;

      public MultiPartWriter() throws IOException {
         long var10001 = System.currentTimeMillis();
         String[] var1 = d;
         this.a = var1[9] + var10001;
         this.b = var1[4].getBytes(StandardCharsets.UTF_8);
         this.c = new ByteArrayOutputStream();
         this.a();
      }

      private void a(String var1) throws IOException {
         this.c.write(var1.getBytes(StandardCharsets.UTF_8));
         this.c.write(this.b);
      }

      private void a() throws IOException {
         this.c.write(this.b);
      }

      private String a(String var1, String var2) {
         String var10000;
         if (var2 != null) {
            String[] var3 = d;
            var10000 = var3[2] + var1 + var3[0] + var2 + "\"";
         } else {
            var10000 = "";
         }

         return var10000;
      }

      private void a(String var1, String var2, String var3) throws IOException {
         String[] var6 = d;
         this.a(var6[3] + this.a);
         FilePartSupplier.MultiPartWriter var10000 = this;
         String var10001 = this.a(var6[8], var1);
         String var4 = this.a(var6[6], var2);
         String var5 = var10001;

         try {
            var10000.a(var6[7] + var5 + var4);
            if (StringUtils.isNotEmpty(var3)) {
               this.a(var6[5] + var3);
            }
         } catch (IOException var7) {
            throw a(var7);
         }

         this.a();
      }

      private void b() throws IOException {
         this.a();
      }

      public void writePart(byte[] var1, ContentTypeHeader var2, String var3) throws IOException {
         this.a(var3, null, var2.getFullValue());
         this.c.write(var1);
         this.b();
      }

      public void writePart(FilePart var1) throws IOException {
         this.a(var1.getName(), var1.getFilename(), var1.getContentType());
         IOUtils.copyStream(var1.getInputStreamSupplier().get(), this.c);
         this.b();
      }

      public void endParts() throws IOException {
         String[] var1 = d;
         this.a(var1[1] + this.a + var1[1]);
      }

      public String getBoundaryString() {
         return this.a;
      }

      public byte[] getBytes() {
         return this.c.toByteArray();
      }

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

      static {
         String[] var5 = new String[10];
         int var3 = 0;
         String var2 = "r\u0007\u0002b\b\u0002t\u0005\u0002b\b\u0002B/\u000e\fJP\u001b% \u0014bqG\u001f%t@\b)LR\n./\r*\u001e\fJP\u001b% \u0014baW\u001c0!\u0013&QW\u0000.t@)JL\u0002m*\u0001;D";
         int var4 = "r\u0007\u0002b\b\u0002t\u0005\u0002b\b\u0002B/\u000e\fJP\u001b% \u0014bqG\u001f%t@\b)LR\n./\r*\u001e\fJP\u001b% \u0014baW\u001c0!\u0013&QW\u0000.t@)JL\u0002m*\u0001;D"
            .length();
         char var1 = 2;
         int var7 = -1;

         label24:
         while (true) {
            byte var10000 = 63;
            String var10001 = var2.substring(++var7, var7 + var1);
            byte var10002 = -1;

            while (true) {
               String var8 = a(var10000, b(var10001));
               switch (var10002) {
                  case 0:
                     var5[var3++] = var8;
                     if ((var7 += var1) >= var4) {
                        d = var5;
                        return;
                     }

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

                     var2 = "H-:c\u0006\u000baz+\u0004\n";
                     var4 = "H-:c\u0006\u000baz+\u0004\n".length();
                     var1 = 4;
                     var7 = -1;
               }

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

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

         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 -> 112;
               case 1 -> 26;
               case 2 -> 1;
               case 3 -> 80;
               case 4 -> 127;
               case 5 -> 113;
               default -> 95;
            });
         }

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