package com.l7tech.server.otel;

import com.l7tech.message.HeadersKnob;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.CustomAssertionHolder;
import com.l7tech.policy.assertion.EncapsulatedAssertion;
import com.l7tech.policy.assertion.SetVariableAssertion;
import com.l7tech.policy.assertion.SslAssertion;
import com.l7tech.server.audit.Auditor;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.otel.util.OtelBaggageUtil;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.api.baggage.BaggageEntry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.api.metrics.DoubleCounter;
import io.opentelemetry.api.metrics.DoubleUpDownCounter;
import io.opentelemetry.api.metrics.LongHistogram;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.ObservableLongGauge;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapGetter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;

public class OtelMetricContextImpl implements OtelContext {
   public static final String OTEL_BAGGAGE_DELETE_CV;
   public static final String OTEL_BAGGAGE_UPDATE_CV;
   public static final Set<String> OTEL_BAGGAGE_KEYWORDS;
   public static final String OTEL_BAGGAGE_KEYS_CV;
   public static final String DEFAULT_BAGGAGE_METADATA_DELIMITER = ";";
   public static final String BAGGAGE_KEYS_WILDCARD = "*";
   private static final Map<String, String> a;
   private static final Map<String, String> b;
   private final Meter c;
   private final String d;
   private final String e;
   private static final Logger f;
   Map<String, BaggageEntry> g = new HashMap<>();
   Baggage h;
   List<OtelBaggageChange> i = new LinkedList<>();
   private final Auditor j;
   static final TextMapGetter<HeadersKnob> k;
   private static final String[] D;

   public OtelMetricContextImpl(String var1, String var2, Auditor var3) {
      this.c = GlobalOpenTelemetry.meterBuilder(D[18]).setInstrumentationVersion(OTEL_SCOPE_VERSION).build();
      this.d = var1 != null ? var1 : "";
      this.e = var2 != null ? var2 : "";
      this.j = var3;
   }

   @Override
   public Span startAssertionSpan(Assertion var1, PolicyEnforcementContext var2) {
      this.a(var1, var2);
      return OtelContext.super.startAssertionSpan(var1, var2);
   }

   @Override
   public Span startServiceSpan(PolicyEnforcementContext var1) {
      Context var2 = OtelContextFactory.getTextMapPropagator().extract(Context.current(), var1.getRequest().getHeadersKnob(), k);
      this.h = Baggage.fromContext(var2);
      this.g.putAll(this.h.asMap());
      OtelBaggageUtil.setBaggageContextVariable(var1, this.g);
      return OtelContext.super.startServiceSpan(var1);
   }

   @Override
   public void recordCounter(String var1, String var2, String var3, long var4, Attributes var6) {
      AttributesBuilder var7 = this.a(var6);
      DoubleCounter var8 = this.c.counterBuilder(this.d + var1).setUnit(var3).setDescription(var2).ofDoubles().build();
      var8.add(var4, var7.build());
      f.log(Level.FINEST, D[1] + var8.toString());
   }

   @Override
   public void recordHistogram(String var1, String var2, String var3, long var4, Attributes var6) {
      AttributesBuilder var7 = this.a(var6);
      LongHistogram var8 = this.c.histogramBuilder(this.d + var1).setUnit(var3).setDescription(var2).ofLongs().build();
      var8.record(var4, var7.build());
      f.log(Level.FINEST, D[12] + var8.toString());
   }

   @Override
   public void recordGauge(String var1, String var2, String var3, long var4, Attributes var6) {
      AttributesBuilder var7 = this.a(var6);
      ObservableLongGauge var8 = this.c
         .gaugeBuilder(this.d + var1)
         .setUnit(var3)
         .setDescription(var2)
         .ofLongs()
         .buildWithCallback(var3x -> var3x.record(var4, var7.build()));
      f.log(Level.FINEST, D[17] + var8.toString());
   }

   @Override
   public void recordUpDownCounter(String var1, String var2, String var3, double var4, Attributes var6) {
      AttributesBuilder var7 = this.a(var6);
      DoubleUpDownCounter var8 = this.c.upDownCounterBuilder(this.d + var1).setUnit(var3).setDescription(var2).ofDoubles().build();
      var8.add(var4, var7.build());
      f.log(Level.FINEST, D[0] + var8.toString());
   }

   @Override
   public <T> Callable<T> wrap(Callable<T> var1) {
      return Context.current().wrap(var1);
   }

   private AttributesBuilder a(Attributes var1) {
      AttributesBuilder var2 = Attributes.builder();
      var1.forEach((var2x, var3) -> var2.put(this.e + var2x, String.valueOf(var3)));
      return var2;
   }

   void a(Assertion var1, PolicyEnforcementContext var2) {
      if (var1 instanceof SetVariableAssertion) {
         String var3 = ((SetVariableAssertion)var1).getVariableToSet();
         String var4 = ((SetVariableAssertion)var1).expression();
         if (var4.isBlank()) {
            return;
         }

         f.fine(() -> D[16].formatted(this.getAssertionFeatureSetName(var1), var3));
         String[] var11 = D;
         if (var11[6].equalsIgnoreCase(var3)) {
            String var5 = Pattern.quote(",");
            String[] var6 = var4.split(var5);

            for (String var10 : var6) {
               var11 = D;
               f.fine(var11[15] + var10);
               this.i.add(new OtelBaggageChange(OtelBaggageChange.BaggageChangeType.DELETE, var10.trim()));
            }
         } else {
            var11 = D;
            if (var11[8].equalsIgnoreCase(var3)) {
               f.fine(var11[11] + var4);
               this.i.addAll(OtelBaggageUtil.createBaggageChangeList(var2, var4, this.j));
            }
         }
      }
   }

   @Override
   public Baggage createBaggage() {
      return OtelBaggageUtil.createBaggage(this.g, this.i);
   }

   protected String generateShortNameCacheKey(Assertion var1) {
      if (var1 instanceof EncapsulatedAssertion || var1 instanceof CustomAssertionHolder) {
         return null;
      } else if (var1 instanceof SslAssertion) {
         boolean var2 = ((SslAssertion)var1).isRequireClientAuthentication();
         return D[10] + var2;
      } else {
         return var1.getClass().getName();
      }
   }

   protected String getAssertionShortName(Assertion var1) {
      String var2 = this.generateShortNameCacheKey(var1);
      return var2 == null ? (String)var1.meta().get(D[9]) : a.computeIfAbsent(var2, var1x -> (String)var1.meta().get(D[7]));
   }

   protected String getAssertionFeatureSetName(Assertion var1) {
      String var2 = this.generateShortNameCacheKey(var1);
      return var2 == null ? var1.getFeatureSetName() : b.computeIfAbsent(var2, var1x -> var1.getFeatureSetName());
   }

   static {
      String[] var5 = new String[19];
      int var3 = 0;
      String var2 = "J\rC^\u0011\u0019WA\u0016Q\\r\u0003Rk\rC@\u0011\u0001Bq\u000bOQ\u0011\bBg\fA\b\u0011\u0019J\rC^\u0011\u000fHp\u0017R\u0012\\\tSw\u0010E\u0012U\tEp\u001e\u001c\u0012\u0006p\tBSE\t\u0013j\rC^\u001f\u000eFb\u001eGUTBRu\u001dGFT\u0013j\rC^\u001f\u000eFb\u001eGUTBC`\u0015CFT\u0011j\rC^\u001f\u000eFb\u001eGUTBL`\u0000U\u0013j\rC^\u001f\u000eFb\u001eGUTBC`\u0015CFT\tv\u0011I@E\"Fh\u001c\u0013j\rC^\u001f\u000eFb\u001eGUTBRu\u001dGFT\tv\u0011I@E\"Fh\u001c\rV\nJsB\u001fBw\rO]_V\u0014P\tBSE\t\u0007G\u0018AUP\u000bB%2CK\u000bL\u001dJ\rC^\u0011\u0004Nv\rIUC\rJ%\u0014CFC\u0005D%\u001dCPD\u000b\u001d%\u0004n\u001c_A\u0006a\u001cJWE\t\u0014A\u001cJWE\t\u0007G\u0018AUP\u000bB%2CK\u000bL\u001aU\u000bIQT\u001fTl\u0017A\u0012p\u001fT`\u000bR[^\u0002\u0007 \n\u001c\u0017B";
      int var4 = "J\rC^\u0011\u0019WA\u0016Q\\r\u0003Rk\rC@\u0011\u0001Bq\u000bOQ\u0011\bBg\fA\b\u0011\u0019J\rC^\u0011\u000fHp\u0017R\u0012\\\tSw\u0010E\u0012U\tEp\u001e\u001c\u0012\u0006p\tBSE\t\u0013j\rC^\u001f\u000eFb\u001eGUTBRu\u001dGFT\u0013j\rC^\u001f\u000eFb\u001eGUTBC`\u0015CFT\u0011j\rC^\u001f\u000eFb\u001eGUTBL`\u0000U\u0013j\rC^\u001f\u000eFb\u001eGUTBC`\u0015CFT\tv\u0011I@E\"Fh\u001c\u0013j\rC^\u001f\u000eFb\u001eGUTBRu\u001dGFT\tv\u0011I@E\"Fh\u001c\rV\nJsB\u001fBw\rO]_V\u0014P\tBSE\t\u0007G\u0018AUP\u000bB%2CK\u000bL\u001dJ\rC^\u0011\u0004Nv\rIUC\rJ%\u0014CFC\u0005D%\u001dCPD\u000b\u001d%\u0004n\u001c_A\u0006a\u001cJWE\t\u0014A\u001cJWE\t\u0007G\u0018AUP\u000bB%2CK\u000bL\u001aU\u000bIQT\u001fTl\u0017A\u0012p\u001fT`\u000bR[^\u0002\u0007 \n\u001c\u0017B"
         .length();
      char var1 = '!';
      int var7 = -1;

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

         while (true) {
            String var9 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var9;
                  if ((var7 += var1) >= var4) {
                     D = var5;
                     String[] var10 = D;
                     OTEL_BAGGAGE_UPDATE_CV = D[3];
                     OTEL_BAGGAGE_DELETE_CV = var10[4];
                     OTEL_BAGGAGE_KEYS_CV = var10[5];
                     String[] var8 = D;
                     OTEL_BAGGAGE_KEYWORDS = Set.of(var8[13], var8[2], var8[14]);
                     a = new ConcurrentHashMap<>();
                     b = new ConcurrentHashMap<>();
                     f = Logger.getLogger(OtelMetricContextImpl.class.getName());
                     k = new c();
                     return;
                  }

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

                  var2 = "I\u000e@]\u0012\bEs\u001d@sG\u0006Hb\u001fW\u0011_\nPt\u0013F\u0011V\nFs\u001d\u001f\u0011\u0012e\u0015H\u001f^\u000e]c\b\u0012\u001fU\u000ePc\rDH";
                  var4 = "I\u000e@]\u0012\bEs\u001d@sG\u0006Hb\u001fW\u0011_\nPt\u0013F\u0011V\nFs\u001d\u001f\u0011\u0012e\u0015H\u001f^\u000e]c\b\u0012\u001fU\u000ePc\rDH"
                     .length();
                  var1 = ' ';
                  var7 = -1;
            }

            var10000 = 127;
            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] ^ 91);
      }

      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 -> 121;
            case 1 -> 5;
            case 2 -> 90;
            case 3 -> 78;
            case 4 -> 77;
            case 5 -> 16;
            default -> 91;
         });
      }

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