{-# LANGUAGE OverloadedStrings #-}
module HolyProject.GithubAPI
    (searchGHUser)
where

import qualified Data.ByteString.Lazy.Char8 as  LZ
-- HTTP request and JSON handling
import Network.HTTP.Conduit
import Control.Lens.Operators       ((^?))
import Data.Aeson.Encode            (encodeToTextBuilder)
import Data.Aeson.Lens              (key,nth)
import qualified Data.Text.Lazy as TLZ
import qualified Data.Text.Lazy.Builder as TLB
import Control.Monad                ((<=<))

-- | make a simple http request but add a user agent to the HTTP header
-- You HAVE TO add a User-Agent in your header to use the github API.
simpleHTTPWithUserAgent :: String -> IO LZ.ByteString
simpleHTTPWithUserAgent url = do
    r  <- parseUrl url
    let request = r { requestHeaders =  [ ("User-Agent","HTTP-Conduit") ] }
    withManager $ (return.responseBody) <=< httpLbs request

-- | Search a username using the github API
searchGHUser :: String -> IO (Maybe String)
searchGHUser ""    = return Nothing
searchGHUser email = do
    let url = "https://api.github.com/search/users?q=" ++ email
    body <- simpleHTTPWithUserAgent url
    let login = body ^? key "items" . nth 0 . key "login"
    return $ fmap jsonValueToString login
    where
        jsonValueToString = TLZ.unpack . TLB.toLazyText . encodeToTextBuilder