{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Network.Datadog.Metrics
  ( Series (..)
  , Metric (..)
  , MetricPoints (..)
  , sendMetrics
  , series
  , HasName(..)
  , HasPoints(..)
  , HasTags(..)
  , HasHost(..)
  , AsMetricPoints(..)
  ) where
import Control.Monad (void)
import Data.Aeson hiding (Series)
import Data.DList
import qualified Network.HTTP.Types  as HTTP
import qualified Network.HTTP.Client as C
import Network.Datadog.Internal

series :: [Metric] -> Series
series = Series . fromList

metricRequest :: C.Request
metricRequest = baseRequest { C.method = HTTP.methodPost
                            , C.path = "/api/v1/series"
                            , C.requestHeaders = [("Content-Type", "application/json")]
                            }

sendMetrics :: DatadogCredentials k => DatadogClient k -> Series -> IO ()
sendMetrics m s = void $ C.httpNoBody req $ datadogClientManager m
  where
    req = (signRequest (datadogClientKeys m) metricRequest) { C.requestBody = C.RequestBodyLBS $ encode s }

-- | Wall clock time
{-
withTimingMetric :: DatadogCredentials k => DatadogClient k
                 -> (Metric -> IO ())
                 -> Text        -- ^ metric
                 -> Maybe Text  -- ^ hostname
                 -> [Text]      -- ^ tags
                 -> IO a
                 -> IO a
withTimingMetric mAction m h ts action = do
  t <- getCurrentTime
  r <- action
  t' <- getCurrentTime
  mAction $ Metric m [Counter diff]diffUTCTime t' t
-}