{-# LANGUAGE OverloadedStrings #-}
module PureScript.Ide.Pursuit where

import           Control.Lens
import           Data.Aeson.Lens
import           Data.Either
import           Data.Monoid
import           Data.Text              (Text)
import qualified Data.Text              as T
import           Network.Wreq
import           PureScript.Ide.Types
import           PureScript.Ide.Externs (typeParse)

queryUrl :: Text
queryUrl = "http://pursuit.purescript.org/search?q="

jsonOpts :: Options
jsonOpts = defaults & header "Accept" .~ ["application/json"]

myZip :: [a] -> [(b, c)] -> [(a, b, c)]
myZip = zipWith (\a (b, c) -> (a, b, c))

searchPursuit :: Text -> IO [Completion]
searchPursuit query = do
    r <- getWith jsonOpts (T.unpack $ queryUrl <> query)
    let texts = r ^.. responseBody . values . key "text" . _String
    let moduleNames = r ^..
                      responseBody .
                      values .
                      key "info" .
                      key "module" .
                      _String
    return . fmap Completion . myZip moduleNames . rights $ typeParse <$> texts