module Development.Shake.ATS.Environment ( fixDir
                                         , pkgHome
                                         , patsHome
                                         , ccToDir
                                         ) where

import           Control.Monad.IO.Class
import qualified Data.Text.Lazy             as TL
import           Development.Shake.ATS.Type
import           Development.Shake.C
import           Development.Shake.FilePath
import           System.Environment         (getEnv)

ccToDir :: CCompiler -> String
ccToDir (GCC (Just s)) = reverse (drop 1 $ reverse s) ++ "/"
ccToDir _              = ""

-- | The directory @~/.atspkg@
pkgHome :: MonadIO m => CCompiler -> m String
pkgHome cc' = liftIO $ (++ ("/.atspkg/" ++ ccToDir cc')) <$> getEnv "HOME"

-- | The directory that will be @PATSHOME@.
patsHome :: MonadIO m => Version -> m String
patsHome v = fmap (++ (show v ++ "/")) (pkgHome (GCC Nothing))

fixDir :: FilePath -> String -> String
fixDir p =
      TL.unpack
    . TL.replace (TL.pack "./") (TL.pack $ p ++ "/")
    . TL.replace (TL.pack "../") (TL.pack $ joinPath (init $ splitPath p) ++ "/")
    . TL.replace (TL.pack "$PATSHOMELOCS") (TL.pack ".atspkg/contrib")
    . TL.pack