module Buffet.Document.TemplateContext
  ( get
  ) where

import qualified Buffet.Document.TemplateBuffet as TemplateBuffet
import qualified Buffet.Ir.Ir as Ir
import qualified Data.Aeson as Aeson
import qualified Data.Bifunctor as Bifunctor
import qualified Data.HashMap.Strict as HashMap
import qualified Data.Text as T
import Prelude (($), (.), fmap)

get :: Ir.Buffet -> Aeson.Value
get = escapeKeysForMustache . Aeson.toJSON . TemplateBuffet.get

escapeKeysForMustache :: Aeson.Value -> Aeson.Value
escapeKeysForMustache = mapKeys $ T.replace (T.pack ".") (T.pack "_")

mapKeys :: (T.Text -> T.Text) -> Aeson.Value -> Aeson.Value
mapKeys function (Aeson.Array array) =
  Aeson.Array $ fmap (mapKeys function) array
mapKeys function (Aeson.Object object) =
  Aeson.Object .
  HashMap.fromList . fmap (Bifunctor.bimap function $ mapKeys function) $
  HashMap.toList object
mapKeys _ value = value