import * as Sentry from "@sentry/nextjs"

import { env } from "./env/server"
import { isEdge } from "./utils/isEdge"

export async function register() {
  /*
    Order matters!

    Sentry hooks into OpenTelemetry, modifying its behavior.
    Application Insights relies on OpenTelemetry exporters,
    and these may not work correctly if Sentry has already altered the instrumentation pipeline.
  */
  await configureApplicationInsights()
  await configureSentry()
}

export const onRequestError = Sentry.captureRequestError

async function configureApplicationInsights() {
  if (
    process.env.NEXT_RUNTIME === "nodejs" &&
    env.APPLICATION_INSIGHTS_CONNECTION_STRING
  ) {
    const { AzureMonitorTraceExporter, AzureMonitorMetricExporter } =
      await import("@azure/monitor-opentelemetry-exporter")
    const { registerOTel } = await import("@vercel/otel")
    const { PeriodicExportingMetricReader } = await import(
      "@opentelemetry/sdk-metrics"
    )
    const connectionString: string = env.APPLICATION_INSIGHTS_CONNECTION_STRING
    const traceExporter = new AzureMonitorTraceExporter({ connectionString })
    const azureMetricExporter = new AzureMonitorMetricExporter({
      connectionString,
    })
    const azureMetricReader = new PeriodicExportingMetricReader({
      exporter: azureMetricExporter,
      exportIntervalMillis: 10000,
    })
    registerOTel({
      serviceName: "scandic-web",
      traceExporter,
      metricReader: azureMetricReader,
    })
  }
}

async function configureSentry() {
  if (isEdge) {
    await import("./sentry.edge.config")
  } else {
    await import("./sentry.server.config")
  }
}
