package com.l7tech.gateway.common.transport.jms;

import com.l7tech.gateway.common.admin.Administrative;
import com.l7tech.gateway.common.security.rbac.MethodStereotype;
import com.l7tech.gateway.common.security.rbac.Secured;
import com.l7tech.objectmodel.DeleteException;
import com.l7tech.objectmodel.EntityType;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.SaveException;
import com.l7tech.objectmodel.UpdateException;
import com.l7tech.objectmodel.VersionException;
import com.l7tech.policy.assertion.JmsMessagePropertyRule;
import com.l7tech.util.DeserializeSafe;
import java.io.Serializable;
import java.util.EnumSet;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Secured
@Administrative
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
@DeserializeSafe
public interface JmsAdmin {
   @Transactional(readOnly = true)
   @Secured(stereotype = MethodStereotype.UNCHECKED_WIDE_OPEN)
   EnumSet<JmsProviderType> getProviderTypes() throws FindException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.FIND_ENTITIES)
   JmsConnection[] findAllConnections() throws FindException;

   @Transactional(readOnly = true)
   @Secured(
      types = EntityType.JMS_ENDPOINT,
      stereotype = MethodStereotype.FIND_ENTITIES,
      customEntityTranslatorClassName = "com.l7tech.server.admin.JmsTupleEntityTranslator"
   )
   JmsAdmin.JmsTuple[] findAllTuples() throws FindException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.FIND_ENTITY)
   JmsConnection findConnectionByPrimaryKey(Goid var1) throws FindException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_ENDPOINT, stereotype = MethodStereotype.FIND_ENTITY)
   JmsEndpoint findEndpointByPrimaryKey(Goid var1) throws FindException;

   @Secured(types = EntityType.JMS_ENDPOINT, stereotype = MethodStereotype.SET_PROPERTY_BY_ID)
   void setEndpointMessageSource(Goid var1, boolean var2) throws FindException, UpdateException;

   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.SAVE_OR_UPDATE)
   Goid saveConnection(JmsConnection var1) throws SaveException, VersionException;

   @Secured(types = EntityType.JMS_ENDPOINT, stereotype = MethodStereotype.SAVE_OR_UPDATE)
   Goid saveEndpoint(JmsEndpoint var1) throws SaveException, VersionException;

   @Secured(types = EntityType.JMS_ENDPOINT, stereotype = MethodStereotype.DELETE_BY_ID)
   void deleteEndpoint(Goid var1) throws FindException, DeleteException;

   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.DELETE_BY_ID)
   void deleteConnection(Goid var1) throws FindException, DeleteException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_ENDPOINT, stereotype = MethodStereotype.FIND_ENTITIES)
   JmsEndpoint[] getEndpointsForConnection(Goid var1) throws FindException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.TEST_CONFIGURATION)
   void testConnection(JmsConnection var1) throws JmsTestException;

   @Transactional(readOnly = true)
   @Secured(types = EntityType.JMS_CONNECTION, stereotype = MethodStereotype.TEST_CONFIGURATION)
   void testEndpoint(JmsConnection var1, JmsEndpoint var2) throws JmsTestException, FindException;

   @Transactional(readOnly = true)
   @Secured(stereotype = MethodStereotype.UNCHECKED_WIDE_OPEN)
   long getDefaultJmsMessageMaxBytes();

   @Secured(stereotype = MethodStereotype.UNCHECKED_WIDE_OPEN)
   boolean isValidProperty(JmsMessagePropertyRule var1);

   @Transactional(readOnly = true)
   @Secured(stereotype = MethodStereotype.UNCHECKED_WIDE_OPEN)
   int getDefaultConsumerConnectionSize();

   final class JmsTuple implements Serializable {
      private final JmsConnection connection;
      private final JmsEndpoint endpoint;
      static final long serialVersionUID = -1469256203993687862L;
      private static final String[] a;

      public JmsTuple(JmsConnection var1, JmsEndpoint var2) {
         if (var1 == null) {
            String[] var3 = a;
            throw new IllegalArgumentException(var3[0]);
         }

         try {
            if (var2 == null) {
               throw new IllegalArgumentException(a[1]);
            }
         } catch (IllegalArgumentException var4) {
            throw a(var4);
         }

         this.connection = var1;
         this.endpoint = var2;
      }

      public JmsConnection getConnection() {
         return this.connection;
      }

      public JmsEndpoint getEndpoint() {
         return this.endpoint;
      }

      public boolean isTemplate() {
         // $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: getfield com/l7tech/gateway/common/transport/jms/JmsAdmin$JmsTuple.connection Lcom/l7tech/gateway/common/transport/jms/JmsConnection;
         // 04: invokevirtual com/l7tech/gateway/common/transport/jms/JmsConnection.isTemplate ()Z
         // 07: ifne 1b
         // 0a: aload 0
         // 0b: getfield com/l7tech/gateway/common/transport/jms/JmsAdmin$JmsTuple.endpoint Lcom/l7tech/gateway/common/transport/jms/JmsEndpoint;
         // 0e: invokevirtual com/l7tech/gateway/common/transport/jms/JmsEndpoint.isTemplate ()Z
         // 11: ifeq 23
         // 14: goto 1b
         // 17: invokestatic com/l7tech/gateway/common/transport/jms/JmsAdmin$JmsTuple.a (Ljava/lang/IllegalArgumentException;)Ljava/lang/IllegalArgumentException;
         // 1a: athrow
         // 1b: bipush 1
         // 1c: goto 24
         // 1f: invokestatic com/l7tech/gateway/common/transport/jms/JmsAdmin$JmsTuple.a (Ljava/lang/IllegalArgumentException;)Ljava/lang/IllegalArgumentException;
         // 22: athrow
         // 23: bipush 0
         // 24: ireturn
         // try (0 -> 8): 9 java/lang/IllegalArgumentException
         // try (4 -> 13): 13 java/lang/IllegalArgumentException
      }

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

      static {
         String[] var5 = new String[2];
         int var3 = 0;
         String var2 = "2\u0011\u00143:\u0011g=\u001f\u0013\u0019:\u0011)1\u000fG\u00020\u000e|1\u000e\u0002\u0014\u00172\u0011\u00145;\u001by7\u0015\t\u0004u\u0016zx\u000e\u0002\u0001 \u0016{=\u0018";
         int var4 = "2\u0011\u00143:\u0011g=\u001f\u0013\u0019:\u0011)1\u000fG\u00020\u000e|1\u000e\u0002\u0014\u00172\u0011\u00145;\u001by7\u0015\t\u0004u\u0016zx\u000e\u0002\u0001 \u0016{=\u0018"
            .length();
         char var1 = 25;
         int var0 = -1;

         while (true) {
            String var10002 = a(17, a(var2.substring(++var0, var0 + var1)));
            byte var10001 = -1;
            var5[var3++] = var10002;
            if ((var0 += var1) >= var4) {
               a = var5;
               return;
            }

            var1 = var2.charAt(var0);
         }
      }

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

         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 -> 73;
               case 1 -> 109;
               case 2 -> 118;
               case 3 -> 97;
               case 4 -> 68;
               case 5 -> 110;
               default -> 24;
            });
         }

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