module OpenTelemetry.Explicit
  ( startRootSpan,
    startChildSpan,
    endSpan,
    setTag,
    addEvent,
    createOpenTelemetryClient,
  )
where

import qualified Data.Text as T
import GHC.Conc
import OpenTelemetry.Common
import System.Clock
import System.Random

data Client
  = Client
      { cTracer :: Tracer ThreadId,
        cSpanExporter :: Exporter Span
      }

startRootSpan :: Client -> T.Text -> IO Span
startRootSpan _tracer name = do
  timestamp <- now64
  sid <- randomIO
  pure $! Span (SpanContext (SId sid) (TId sid)) name timestamp 0 mempty OK

startChildSpan :: Client -> Span -> T.Text -> IO Span
startChildSpan _tracer parent name = do
  timestamp <- now64
  sid <- randomIO
  pure $! Span (SpanContext (SId sid) (spanTraceId parent)) name timestamp 0 mempty OK

endSpan :: Client -> Span -> IO ()
endSpan _tracer sp = do
  timestamp <- now64
  pure $! sp {spanFinishedAt = timestamp}
  pure ()

setTag :: Monad m => Client -> Span -> T.Text -> value -> m ()
setTag _tracer _span _key _value = pure ()

addEvent :: Monad m => Client -> Span -> T.Text -> m ()
addEvent _tracer _span _name = pure ()

createOpenTelemetryClient :: Exporter Span -> IO Client
createOpenTelemetryClient e = do
  t <- createTracer
  pure $ Client t e