{-# LANGUAGE OverloadedStrings #-}

module NLP.GenI.Client where

import qualified Data.ByteString             as B
import           Data.Text                   as T
import           Data.Text.Encoding          as T
import           Data.Word                   (Word16)

import           Network.Http.Client
import           NLP.GenI
import           NLP.GenI.Server.Instruction as Geni
import           System.IO.Streams           (InputStream, OutputStream, stdout)
import qualified System.IO.Streams           as Streams
import qualified Text.JSON                   as Json

realise :: B.ByteString  -- ^ server
        -> Word16        -- ^ port
        -> [String]      -- ^ parameters
        -> T.Text        -- ^ semantics
        -> IO (Json.Result GeniResults)
realise server port params sem = do
    c <- openConnection server port
    q <- buildRequest $ do
        http POST "/dump"
    semStream <- Streams.fromByteString (toJson instr)
    sendRequest c q (inputStreamBody semStream)
    resp <- receiveResponse c concatHandler
    closeConnection c
    return (fromJson resp)
  where
    instr    = Geni.ServerInstruction params (T.unpack sem)
    -- really ought to switch to aeson
    toJson   = T.encodeUtf8 . T.pack   . Json.encode
    fromJson = Json.decode  . T.unpack . T.decodeUtf8