module Main
where

import Network.Curl
import System.IO (hClose)
import System.Directory (getTemporaryDirectory)
import System.IO.Temp (openTempFile)

default_curl_opts :: [CurlOption]
default_curl_opts =
  [ CurlDNSUseGlobalCache False,
    CurlDNSCacheTimeout 0,
    CurlFollowLocation True,
    CurlTimeout 45 ]


make_cookie_jar :: IO FilePath
make_cookie_jar = do
  temp_dir <- getTemporaryDirectory
  let file_name_template = "network-curl-test-haskell.txt"
  (out_path, out_handle) <- openTempFile temp_dir file_name_template
  hClose out_handle -- We just want to create it for now.
  return out_path


-- | Log in using curl. Store the resulting session cookies in the
--   supplied file.
log_in :: FilePath -> String -> IO (Either String String)
log_in cookie_jar url =
  withCurlDo $ do
    curl <- initialize
    resp <- do_curl_ curl url curl_opts :: IO CurlResponse
    let code = respCurlCode resp

    return $
      case code of
        CurlOK -> Right (respBody resp)
        error_code -> Left $ "HTTP Error: " ++ (show error_code)
  where
    post_data :: [String]
    post_data = ["username=foo", "password=bar"]

    post_opts :: [CurlOption]
    post_opts =
      [ CurlCookieSession True,
        CurlCookieJar cookie_jar,
        CurlPost True,
        CurlPostFields post_data ]

    curl_opts :: [CurlOption]
    curl_opts = default_curl_opts ++ post_opts



get_page :: FilePath -> String -> IO String
get_page cookie_jar url =
  withCurlDo $ do
    curl <- initialize
    resp <- do_curl_ curl url curl_opts :: IO CurlResponse
    let code = respCurlCode resp

    return $
      case code of
        CurlOK -> respBody resp
        error_code -> "HTTP Error: " ++ (show error_code)

  where
    get_opts = [ CurlCookieFile cookie_jar ]
    curl_opts = default_curl_opts ++ get_opts



main :: IO ()
main = do
  cj <- make_cookie_jar
  li_result <- log_in cj page1_url
  case li_result of
    Left err -> do
      let msg = "Failed to log in. " ++ err
      putStrLn msg
    Right _ -> do
      putStrLn "Logged in..."

  page2_result <- get_page cj page2_url
  putStrLn page2_result

  where
    page1_url = "http://michael.orlitzky.com/tmp/network-curl-test1.php"
    page2_url = "http://michael.orlitzky.com/tmp/network-curl-test2.php"
