{-# LANGUAGE OverloadedStrings #-}

module Test.WebDriver.Server.Download (
    downloadJar
) where

import Data.ByteString.UTF8
import qualified Data.Conduit as C
import Data.Conduit.Binary (sinkFile)
import Network.HTTP.Conduit
import Network.HTTP.Conduit.Downloader
import System.Directory
import System.FilePath
import Text.Regex.TDFA
import Text.Regex.TDFA.ByteString

downloadJar :: Maybe String -> IO FilePath
downloadJar Nothing = do
    latest <- latestJarVersion
    downloadJar (Just latest)

downloadJar (Just v) = do
    userdata <- getAppUserDataDirectory "selenium-hs"
    let fname = "selenium-server-standalone-" ++ v ++ ".jar"
        jarpath = userdata </> fname
    e <- doesFileExist jarpath
    if e
        then return jarpath
        else do
            createDirectoryIfMissing True userdata
            req <- parseUrl $ "http://selenium.googlecode.com/files/" ++ fname
            withManager $ \man -> do
                response <- http req man
                responseBody response C.$$+- sinkFile jarpath
            return jarpath

latestJarVersion :: IO String
latestJarVersion = do
    bod <- urlGetContents "http://code.google.com/p/selenium/downloads/list"
    let Right reg = compile defaultCompOpt defaultExecOpt
                        "selenium-server-standalone-([0-9]+\\.[0-9]+\\.[0-9]+)\\.jar"
        Right (Just (_,_,_,[vers])) = regexec reg bod
    return $ toString vers