{-# LANGUAGE ScopedTypeVariables #-}

module Gamgine.System where
import System.Environment (getProgName, getEnv)
import System.Directory (createDirectoryIfMissing, getAppUserDataDirectory, getDirectoryContents)
import Data.List (takeWhile)
import Data.Time.Clock (getCurrentTime, utctDay)
import Data.Time.Calendar (toGregorian)
import Control.Exception (try)
import Control.Monad (filterM)

normalizedProgName :: IO (String)
normalizedProgName = do
   pn <- getProgName
   return $ takeWhile (/= '.') pn

getCurrentDate :: IO (Integer,Int,Int) -- :: (year,month,day)
getCurrentDate = getCurrentTime >>= return . toGregorian . utctDay

getEnvOrDefault :: String -> String -> IO String
getEnvOrDefault envVar defaultValue = do
   result <- try $ getEnv envVar
   case result of
	Right value          -> return value
	Left  (_ :: IOError) -> return defaultValue

appDirectory = normalizedProgName >>= \pn -> getAppUserDataDirectory pn

getAndCreateAppDir :: IO (FilePath)
getAndCreateAppDir = do
   dir <- appDirectory
   createDirectoryIfMissing True dir
   return dir

getDirContents :: FilePath -> IO [FilePath]
getDirContents dir = do
   entries <- getDirectoryContents dir
   filterM notDots entries
   where
      notDots entry = return . not $ "." == entry || ".." == entry