module Download where

import Network.Browser
import Network.URI
import Network.HTTP.Base

import qualified Codec.Archive.Tar as Tar ( read, unpack )
import System.FilePath
import System.Directory
import Codec.Compression.GZip( decompress )
import Control.Monad

baseurl :: String
baseurl = "http://repos.mornfall.net/darcs/benchmark-repos/"

download :: String -> IO ()
download repo = do
  let Just url = parseURI $ baseurl  ++ repo ++ ".tgz"
  putStrLn $ "downloading and extracting: " ++ show url
  exist_dir <- doesDirectoryExist $ "repo" <.> repo
  exist_file <- doesFileExist $ "repo" <.> repo
  let go = do (_, rsp) <- browse $ do setCheckForProxy True
                                      setOutHandler (const $ return ())
                                      request (mkRequest GET url)
              when (rspCode rsp /= (2, 0, 0)) $
                   fail ("download failed: " ++ rspReason rsp)
              createDirectory $ "repo" <.> repo
              let bits = rspBody rsp
                  entries = Tar.read $ decompress bits
              Tar.unpack ("repo" <.> repo) entries

  if (exist_dir || exist_file)
       then putStrLn $ "repo" <.> repo ++ " already exists, skipping!"
       else go

