module Wiki4e.Commands.Common ( Wiki4eConfig(..)
                              , wiki4e_initConfig
                              , readFileUTF8
                              , toLazy
                              , forceList ) 
where
import System.FilePath
import System.IO
import System.Directory
import qualified Data.ByteString.Lazy as STRL
import qualified Data.ByteString as STR

-- | Basic configuration of the commands
data Wiki4eConfig = Wiki4eConfig { w4confDirFetch      :: FilePath,
                                   w4confDirImg        :: FilePath,
                                   w4confDirSanitized  :: FilePath }

-- Support Functions
getWiki4eDir :: IO FilePath
getWiki4eDir = getAppUserDataDirectory "wiki4e"

wiki4e_initConfig :: IO Wiki4eConfig
wiki4e_initConfig = do
  tmpDir <- getWiki4eDir
  let tmpDirFetch    = tmpDir </> "wiki4e_fetch"     
  let tmpDirSanitize = tmpDir </> "wiki4e_sanitize"
  let tmpDirImgs     = tmpDir </> "wiki4e_images"
  createDirectoryIfMissing True tmpDirFetch
  createDirectoryIfMissing True tmpDirSanitize
  createDirectoryIfMissing True tmpDirImgs
  return (Wiki4eConfig tmpDirFetch tmpDirImgs tmpDirSanitize)

readFileUTF8 :: FilePath -> IO String
readFileUTF8 x = do
          h <- openBinaryFile x ReadMode
          hSetEncoding h utf8
          c <- hGetContents h
          forceList c `seq` hClose h
          return c

toLazy :: STR.ByteString -> STRL.ByteString
toLazy xs = STRL.pack $ STR.unpack xs 

forceList :: String -> String
forceList [] = []
forceList (x:xs) = forceList xs `seq` (x:xs)