{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module DigitalOcean.Base (
  Authentication(..),
  requestGet,
  requestPost
                         ) where

import Control.Applicative ((<$>))

import Control.Monad.IO.Class
import Data.Aeson ( ToJSON, encode)
import qualified Data.ByteString.Lazy.Char8 as BS
import Data.ByteString.Lazy(ByteString)
import Network.HTTP.Conduit
import Network.HTTP.Types.Header
import Data.ByteString.Char8(pack)
import Network.HTTP.Types.Method(methodPost, methodGet, Method)

-- Authentication "api token"
data Authentication = Authentication {
  token    :: String
} deriving (Show)


url :: String
url = "https://api.digitalocean.com/v2"

simpleHttp' :: MonadIO m => String -> Authentication -> Method -> Maybe(ByteString) -> m BS.ByteString
simpleHttp' url' auth reqMethod reqBody = liftIO $ withManager $ \man -> do  
  initReq <- liftIO $ parseUrl url'
  let req = initReq {
        method = reqMethod,
        requestHeaders = [(hContentType, Data.ByteString.Char8.pack "application/json"),
                         (hAuthorization,  Data.ByteString.Char8.pack $ "Bearer " ++ (token auth))],
        responseTimeout = Just 10000000, -- 10 seconds
        requestBody = case reqBody of Just b  -> RequestBodyLBS b
                                      Nothing -> requestBody initReq
  }
  responseBody <$> httpLbs req man


--dumpP :: (ToJSON j) =>  String -> Authentication -> j -> (MonadIO m) => m (BS.ByteString)
--dumpP   suburl auth body = simpleHttp' (url ++ "/" ++ suburl) auth methodPost $ Just (encode body)

--dumpG ::   String -> Authentication -> (MonadIO m) => m (BS.ByteString)
--dumpG   suburl auth = simpleHttp' (url ++ "/" ++ suburl) auth methodGet  Nothing

requestGet ::  String -> Authentication -> (MonadIO m) => m BS.ByteString
requestGet suburl auth = simpleHttp' (url ++ "/" ++ suburl)  auth methodGet Nothing


requestPost :: (ToJSON b) =>  String -> Authentication -> b -> (MonadIO m) => m BS.ByteString
requestPost suburl auth  body = simpleHttp' (url ++ "/" ++ suburl)  auth methodPost $ Just (encode body)