package com.l7tech.server.otel.mediator;

import com.l7tech.gateway.common.service.PublishedService;
import com.l7tech.objectmodel.Goid;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.policy.variable.NoSuchVariableException;
import com.l7tech.policy.variable.Syntax;
import com.l7tech.server.MessageProcessorMediator;
import com.l7tech.server.audit.Auditor;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.otel.OtelContext;
import com.l7tech.server.otel.OtelContextFactory;
import com.l7tech.server.otel.util.OtelTraceConfigUtil;
import com.l7tech.server.policy.variable.ExpandVariables;
import com.l7tech.server.service.ServiceCache;
import com.l7tech.util.Config;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Scope;
import java.util.HashMap;
import java.util.Map.Entry;

public class OtelMessageProcessorMediator implements MessageProcessorMediator {
   private final OtelContextFactory a;
   private final ServiceCache b;
   private final Config c;
   private Span d;
   private Scope e;
   private static final String[] f;

   public OtelMessageProcessorMediator(OtelContextFactory var1, ServiceCache var2, Config var3) {
      this.a = var1;
      this.b = var2;
      this.c = var3;
   }

   @Override
   public void processMessageStart(PolicyEnforcementContext var1) {
      OtelContext var2 = this.a.create(var1, this.b);
      var1.setOtelContext(var2);
      this.d = var2.startServiceSpan(var1);
      this.e = this.d.makeCurrent();
   }

   @Override
   public void processMessagePostReallyProcessMessage(AssertionStatus var1) {
      if (var1 == AssertionStatus.NONE) {
         this.d.setStatus(StatusCode.OK, var1.getMessage());
      } else {
         this.d.setStatus(StatusCode.ERROR, var1.getMessage());
      }
   }

   @Override
   public void doRequestPostProcessing(PolicyEnforcementContext var1, String var2, Auditor var3) {
      this.a(var1, var2, var3);
   }

   private boolean a() {
      return this.c.getBooleanProperty(f[16], false);
   }

   private String b() {
      return this.c.getProperty(f[9], "");
   }

   private void a(PolicyEnforcementContext var1, String var2, Auditor var3) {
      if (var1.isPolicyExecutionAttempted() && this.a()) {
         OtelContext var4 = var1.getOtelContext();
         Goid var5 = var1.getService() == null ? PublishedService.DEFAULT_GOID : var1.getService().getGoid();
         AttributesBuilder var6 = Attributes.builder();
         String[] var10 = f;
         var6.put(var10[18], var2);
         var6.put(var10[17], var1.getService().getName());
         var6.put(var10[21], var5.toString());
         if (var1.getRequest().isHttpRequest()) {
            var6.put(var10[6], var1.getService().getRoutingUri());
            var6.put(var10[10], var1.getRequest().getHttpRequestKnob().getMethodAsString());
         }

         this.a(var1, var6, var3);
         this.a(var1, var6);
         Attributes var7 = var6.build();
         var10 = f;
         var4.recordCounter(var10[5], var10[0], var10[2], 1L, var7);
         int var8 = (int)(var1.getEndTime() - var1.getStartTime());
         int var9 = (int)var1.getRoutingTotalTime();
         var4.recordHistogram(var10[8], var10[14], var10[11], var8, var7);
         var4.recordHistogram(var10[20], var10[4], var10[15], var9, var7);
         if (!var1.isAuthorizedRequest()) {
            var4.recordCounter(var10[19], var10[23], var10[3], 1L, var7);
         }

         if (var1.isAuthorizedRequest() && !var1.isCompletedRequest()) {
            var10 = f;
            var4.recordCounter(var10[12], var10[7], var10[3], 1L, var7);
         }

         if (var1.isAuthorizedRequest() && var1.isCompletedRequest()) {
            var10 = f;
            var4.recordCounter(var10[1], var10[22], var10[3], 1L, var7);
         }
      }
   }

   private void a(PolicyEnforcementContext var1, AttributesBuilder var2) {
      Object var3 = null;

      try {
         var3 = var1.getVariable(f[13]);
      } catch (NoSuchVariableException var8) {
      }

      if (var3 instanceof String) {
         String var4 = String.valueOf(var3);
         if (!var4.isBlank()) {
            HashMap var5 = new HashMap();
            OtelTraceConfigUtil.setCustomAttributesMap(var4, var5);
            if (!var5.isEmpty()) {
               for (Entry var7 : var5.entrySet()) {
                  var2.put((String)var7.getKey(), (String)var7.getValue());
               }
            }
         }
      }
   }

   private void a(PolicyEnforcementContext var1, AttributesBuilder var2, Auditor var3) {
      String var4 = this.b();
      if (!var4.isBlank()) {
         HashMap var5 = new HashMap();
         OtelTraceConfigUtil.setCustomAttributesMap(var4, var5);
         if (!var5.isEmpty()) {
            for (Entry var7 : var5.entrySet()) {
               String var8 = (String)var7.getValue();
               String[] var9 = Syntax.getReferencedNames(var8);
               if (var9.length > 0) {
                  String var10 = ExpandVariables.process(var8, var1.getVariableMap(var9, var3), var3);
                  var2.put((String)var7.getKey(), var10);
               } else {
                  var2.put((String)var7.getKey(), (String)var7.getValue());
               }
            }
         }
      }
   }

   @Override
   public void handleException(Exception var1) {
      this.d.recordException(var1);
      this.d.setStatus(StatusCode.ERROR, var1.getClass().getSimpleName());
   }

   @Override
   public void processMessageFinally(PolicyEnforcementContext var1, AssertionStatus var2) {
      var1.getOtelContext().endServiceSpan(this.d, var2, var1);
      if (this.e != null) {
         this.e.close();
      }
   }

   static {
      String[] var5 = new String[24];
      int var3 = 0;
      String var2 = "2\u0013(eL,~\u0003\u000e*mCi\r\u0005\u001d0hS\u000f\u0015\u0019.rIoH9\u000f)gCi^\u0015\u0005\u0005\u0013)jT\u0005\u0005\u0013)jT\r$\u001d?o\u0000IC\u0002\\(mMi\u0011\u0015\u0019.rIoH9\u001d(pEa]\u0012\u00198\n\u0015\u0019.rIoH3\u000e5\u001e2\u0013(eL,~\u0003\u000e*mCi\r4\u0013)pIbJF\u001a=mLy_\u0003\u000f\u000f\u0015\u0019.rIoH9\u0010=pEbN\u001f\u001e\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gS\"L\u0012\b.mByY\u0003\u000f\u0006\u000b\u0019(lOh\u0002\u000b\u000f\u0018\u0015\u0019.rIoH9\u000e3qTeC\u0001#:eI`X\u0014\u0019/\u001e\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gS\"L\u0012\b.mByY\u0003\u000f\u000e \u000e3jT,h\b\u0018|pIaH\u0002\u000b\u000f\u0019\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gebL\u0004\u00109`\u000b\u0015\u0019.rIoH(\u001d1a\t\t\f9vAxD\t\u0012\u0019\u0015\u0019.rIoH9\f3hIoT9\n5kLmY\u000f\u00132w\u0017\u0015\u0019.rIoH9\u000e3qTeC\u0001#0eTiC\u0005\u0005\u0004\u0001\u00135`";
      int var4 = "2\u0013(eL,~\u0003\u000e*mCi\r\u0005\u001d0hS\u000f\u0015\u0019.rIoH9\u000f)gCi^\u0015\u0005\u0005\u0013)jT\u0005\u0005\u0013)jT\r$\u001d?o\u0000IC\u0002\\(mMi\u0011\u0015\u0019.rIoH9\u001d(pEa]\u0012\u00198\n\u0015\u0019.rIoH3\u000e5\u001e2\u0013(eL,~\u0003\u000e*mCi\r4\u0013)pIbJF\u001a=mLy_\u0003\u000f\u000f\u0015\u0019.rIoH9\u0010=pEbN\u001f\u001e\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gS\"L\u0012\b.mByY\u0003\u000f\u0006\u000b\u0019(lOh\u0002\u000b\u000f\u0018\u0015\u0019.rIoH9\u000e3qTeC\u0001#:eI`X\u0014\u0019/\u001e\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gS\"L\u0012\b.mByY\u0003\u000f\u000e \u000e3jT,h\b\u0018|pIaH\u0002\u000b\u000f\u0019\t\b9h\u000e\u007fH\u0014\n5gEAH\u0012\u000e5gebL\u0004\u00109`\u000b\u0015\u0019.rIoH(\u001d1a\t\t\f9vAxD\t\u0012\u0019\u0015\u0019.rIoH9\f3hIoT9\n5kLmY\u000f\u00132w\u0017\u0015\u0019.rIoH9\u000e3qTeC\u0001#0eTiC\u0005\u0005\u0004\u0001\u00135`"
         .length();
      char var1 = 19;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 72;
         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;
                     return;
                  }

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

                  var2 = "5\u0014/bK+y\u0004\t-jDn\n2\u000e8`BxY\u001f5\u0014/bK+y\u0004\t-jDn\n1\u00147jDr\n7\u00124oF\u007fC\u000e\u0015(";
                  var4 = "5\u0014/bK+y\u0004\t-jDn\n2\u000e8`BxY\u001f5\u0014/bK+y\u0004\t-jDn\n1\u00147jDr\n7\u00124oF\u007fC\u000e\u0015(".length();
                  var1 = 21;
                  var7 = -1;
            }

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

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

      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 -> 46;
            case 1 -> 52;
            case 2 -> 20;
            case 3 -> 76;
            case 4 -> 104;
            case 5 -> 68;
            default -> 101;
         });
      }

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