package com.l7tech.server.otel.mediator;

import com.l7tech.common.http.GenericHttpRequestParams;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.AssertionStatus;
import com.l7tech.server.TelemetryMediator;
import com.l7tech.server.message.PolicyEnforcementContext;
import com.l7tech.server.otel.OtelContextFactory;
import com.l7tech.server.policy.assertion.AssertionStatusException;
import io.opentelemetry.api.baggage.Baggage;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.context.propagation.TextMapSetter;

public class OtelTelemetryMediator implements TelemetryMediator {
   private static final TextMapSetter<GenericHttpRequestParams> a = new a();
   private Span b;
   private Scope c;

   @Override
   public void getStartAssertionEvent(Assertion var1, PolicyEnforcementContext var2) {
      this.b = var2.getOtelContext().startAssertionSpan(var1, var2);
      this.c = var2.getOtelContext().getCurrentSpan().makeCurrent();
   }

   @Override
   public void getStatusMsg(AssertionStatus param1) {
      // $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 1
      // 01: ifnull 3d
      // 04: aload 1
      // 05: getstatic com/l7tech/policy/assertion/AssertionStatus.NONE Lcom/l7tech/policy/assertion/AssertionStatus;
      // 08: invokevirtual java/lang/Object.equals (Ljava/lang/Object;)Z
      // 0b: ifne 3d
      // 0e: goto 15
      // 11: invokestatic com/l7tech/server/otel/mediator/OtelTelemetryMediator.a (Lcom/l7tech/server/policy/assertion/AssertionStatusException;)Lcom/l7tech/server/policy/assertion/AssertionStatusException;
      // 14: athrow
      // 15: aload 0
      // 16: getfield com/l7tech/server/otel/mediator/OtelTelemetryMediator.b Lio/opentelemetry/api/trace/Span;
      // 19: new com/l7tech/server/policy/assertion/AssertionStatusException
      // 1c: dup
      // 1d: aload 1
      // 1e: invokespecial com/l7tech/server/policy/assertion/AssertionStatusException.<init> (Lcom/l7tech/policy/assertion/AssertionStatus;)V
      // 21: invokeinterface io/opentelemetry/api/trace/Span.recordException (Ljava/lang/Throwable;)Lio/opentelemetry/api/trace/Span; 2
      // 26: pop
      // 27: aload 0
      // 28: getfield com/l7tech/server/otel/mediator/OtelTelemetryMediator.b Lio/opentelemetry/api/trace/Span;
      // 2b: getstatic io/opentelemetry/api/trace/StatusCode.ERROR Lio/opentelemetry/api/trace/StatusCode;
      // 2e: aload 1
      // 2f: invokevirtual com/l7tech/policy/assertion/AssertionStatus.getMessage ()Ljava/lang/String;
      // 32: invokeinterface io/opentelemetry/api/trace/Span.setStatus (Lio/opentelemetry/api/trace/StatusCode;Ljava/lang/String;)Lio/opentelemetry/api/trace/Span; 3
      // 37: pop
      // 38: return
      // 39: invokestatic com/l7tech/server/otel/mediator/OtelTelemetryMediator.a (Lcom/l7tech/server/policy/assertion/AssertionStatusException;)Lcom/l7tech/server/policy/assertion/AssertionStatusException;
      // 3c: athrow
      // 3d: aload 0
      // 3e: getfield com/l7tech/server/otel/mediator/OtelTelemetryMediator.b Lio/opentelemetry/api/trace/Span;
      // 41: getstatic io/opentelemetry/api/trace/StatusCode.OK Lio/opentelemetry/api/trace/StatusCode;
      // 44: aload 1
      // 45: invokevirtual com/l7tech/policy/assertion/AssertionStatus.getMessage ()Ljava/lang/String;
      // 48: invokeinterface io/opentelemetry/api/trace/Span.setStatus (Lio/opentelemetry/api/trace/StatusCode;Ljava/lang/String;)Lio/opentelemetry/api/trace/Span; 3
      // 4d: pop
      // 4e: return
      // try (0 -> 6): 7 com/l7tech/server/policy/assertion/AssertionStatusException
      // try (2 -> 25): 25 com/l7tech/server/policy/assertion/AssertionStatusException
   }

   @Override
   public void getStatusException(AssertionStatusException var1) {
      this.b.recordException(var1);
      this.b.setStatus(StatusCode.ERROR, var1.getAssertionStatus().getMessage());
   }

   @Override
   public void getThrowableInfo(Throwable var1) {
      this.b.recordException(var1);
      this.b.setStatus(StatusCode.ERROR, var1.getClass().getSimpleName());
   }

   @Override
   public void getEndAssertionEvent(Assertion var1, PolicyEnforcementContext var2) {
      try {
         var2.getOtelContext().endAssertionSpan(this.b, var1, var2);
         if (this.c != null) {
            this.c.close();
         }
      } catch (AssertionStatusException var3) {
         throw a(var3);
      }
   }

   @Override
   public void injectContextTextMapProgpagator(GenericHttpRequestParams var1, PolicyEnforcementContext var2) {
      Baggage var3 = var2.getOtelContext().createBaggage();
      Scope var4 = var3.storeInContext(Context.current()).makeCurrent();

      try {
         TextMapPropagator var5 = OtelContextFactory.getTextMapPropagator();
         this.b = var2.getOtelContext().getCurrentSpan();
         this.c = this.b.makeCurrent();
         var5.inject(Context.current(), var1, a);
      } catch (Throwable var8) {
         if (var4 != null) {
            try {
               var4.close();
            } catch (Throwable var7) {
               var8.addSuppressed(var7);
            }
         }

         throw var8;
      }

      if (var4 != null) {
         var4.close();
      }
   }

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