module SuperUserSpark.Deployer.Internal where

import Import

import System.FilePath.Posix (dropTrailingPathSeparator)
import System.Posix.Files (createSymbolicLink, removeLink)

import SuperUserSpark.Check.Types
import SuperUserSpark.Deployer.Types
import SuperUserSpark.Utils

performClean :: CleanupInstruction -> SparkDeployer ()
performClean (CleanFile fp) = incase deploySetsReplaceFiles $ rmFile fp
performClean (CleanDirectory fp) =
    incase deploySetsReplaceDirectories $ rmDir fp
performClean (CleanLink fp) = incase deploySetsReplaceLinks $ unlink fp

unlink :: Path Abs File -> SparkDeployer ()
unlink = liftIO . removeLink . dropTrailingPathSeparator . toFilePath

rmFile :: Path Abs File -> SparkDeployer ()
rmFile = liftIO . removeFile

rmDir :: Path Abs Dir -> SparkDeployer ()
rmDir = liftIO . removeDirRecur

performDeployment :: Instruction -> IO ()
performDeployment (CopyFile source destination) =
    performCopyFile source destination
performDeployment (CopyDir source destination) =
    performCopyDir source destination
performDeployment (LinkFile source destination) =
    performLinkFile source destination
performDeployment (LinkDir source destination) =
    performLinkDir source destination

performCopyFile :: Path Abs File -> Path Abs File -> IO ()
performCopyFile src dst = do
    ensureDir $ parent dst
    copyFile src dst

performCopyDir :: Path Abs Dir -> Path Abs Dir -> IO ()
performCopyDir src dst = do
    ensureDir $ parent dst
    copyDirRecur src dst

performLinkFile :: Path Abs File -> Path Abs File -> IO ()
performLinkFile src dst = do
    ensureDir $ parent dst
    createSymbolicLink (toFilePath src) (toFilePath dst)

performLinkDir :: Path Abs Dir -> Path Abs Dir -> IO ()
performLinkDir src dst = do
    ensureDir $ parent dst
    createSymbolicLink
        (dropTrailingPathSeparator $ toFilePath src)
        (dropTrailingPathSeparator $ toFilePath dst)