import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { CompressionAlgorithm } from "@opentelemetry/otlp-exporter-base";
import { metrics } from "@opentelemetry/sdk-node";
import { NodeSDKConfig } from "../index.js";
import { LogRecordProcessorMap, SpanProcessorMap } from "../utils.js";
import {
  _logsProcessorConfig,
  _spansProcessorConfig,
} from "./processor-config.js";
import { Exporters } from "./index.js";
import { getNodeSdkConfig } from "../config-manager.js";
import { PIIExporterDecorator } from "./pii-exporter-decorator.js";

export default function buildHttpExporters(config: NodeSDKConfig): Exporters {
  if (config.collectorUrl.endsWith("/")) {
    config.collectorUrl = config.collectorUrl.slice(0, -1);
  }

  return {
    spans: [
      new SpanProcessorMap[config.collectorMode ?? "batch"](
        new PIIExporterDecorator(
          new OTLPTraceExporter({
            url: `${config.collectorUrl}/v1/traces`,
            compression: CompressionAlgorithm.GZIP,
          }),
          getNodeSdkConfig(),
        ),
      ),
      ..._spansProcessorConfig(config),
    ],
    metrics: new metrics.PeriodicExportingMetricReader({
      exporter: new PIIExporterDecorator(
        new OTLPMetricExporter({
          url: `${config.collectorUrl}/v1/metrics`,
          compression: CompressionAlgorithm.GZIP,
        }),
        getNodeSdkConfig(),
      ),
    }),
    logs: [
      ..._logsProcessorConfig(config),
      new LogRecordProcessorMap[config.collectorMode ?? "batch"](
        new PIIExporterDecorator(
          new OTLPLogExporter({
            url: `${config.collectorUrl}/v1/logs`,
            compression: CompressionAlgorithm.GZIP,
          }),
          getNodeSdkConfig(),
        ),
      ),
    ],
  };
}
