{-# LANGUAGE OverloadedStrings #-}

-- | Contains functions needed for rendering plots in IHaskell.
module Web.Lightning.Render
  (
    -- * IHaskell Rendering
    renderPlot
  )
  where

--------------------------------------------------------------------------------
import           Control.Monad.IO.Class

import qualified Data.ByteString.Lazy              as BS
import qualified Data.Text                         as T
import           Data.Text.Encoding                (decodeUtf8)

import           Network.API.Builder.Error
import           Network.HTTP.Client
import           Network.HTTP.Client.TLS

import qualified Text.Blaze.Html                   as BZ

import           Web.Lightning.Types.Visualization (Visualization (..),
                                                    getPublicLink)
--------------------------------------------------------------------------------

-- | For use in IHaskell - Renders the visualization in an IHaskell notebook.
renderPlot :: Either (APIError a) Visualization
              -- ^ The visualization to render.
           -> IO BZ.Markup
              -- ^ The HTML representation of the visualization.
renderPlot (Left _) = return $ BZ.string "No visualization."
renderPlot (Right viz) = do
  manager <- liftIO $ newManager tlsManagerSettings
  req <- parseRequest $ T.unpack $ getPublicLink viz
  vizHtml <- httpLbs req manager

  return $ BZ.preEscapedToMarkup $
    decodeUtf8 $ BS.toStrict $ responseBody vizHtml