-- | Handles directory management for both the template data and the
-- data/scripts that the user generates when using 'hifi'. Internally it uses
-- '$XDG_DATA_HOME' to locate the directory where scripts and data files should
-- end up.
--
-- This usually defaults to '$HOME/.local' in most Linux distributions,
-- but can also be set manually if one chooses to do so.
module Config (templateDir, dataDir, scriptDir) where

import System.Directory
import Paths_hifi

createIfMissingPath :: FilePath -> IO FilePath
createIfMissingPath path = createDirectoryIfMissing True path >> return path

-- | 'xdgDir' finds the user's '$XDG_DATA_HOME' directory and appends a given
-- path to it. '$XDG_DATA_HOME' defaults to '$HOME/.local' in many Linux
-- distributions, but can also be set manually.
xdgDir :: FilePath -> IO FilePath
xdgDir = getXdgDirectory XdgData

-- | 'templateDir' will point to the directory where the supplied data files (templates)
-- end up. The data dir will, when using `stack` end up in the `.stack-work`
-- folder. This directory is then used in order to read the templates at runtime
-- so that they can be used when writing new script/data files.
templateDir :: IO FilePath
templateDir = getDataFileName "templates"

-- | 'dataDir' points to a folder in the XDG data directory where it will store
-- the data files used to connect to networks. The subdirectory that will be used
-- is '$XDG_DATA_HOME/hifi/data'. If this directory does not already exist when
-- 'dataDir' is evaluated, it will be created.
dataDir :: IO FilePath
dataDir = xdgDir "hifi/data" >>= createIfMissingPath

-- | 'scriptDir' points to a folder in the XDG data directory where it will store
-- the scripts it generates to connect to networks. The subdirectory that will be
-- used is '$XDG_DATA_HOME/hifi/scripts'. If this directory does not already exist when
-- 'scriptDir' is evaluated, it will be created.
scriptDir :: IO FilePath
scriptDir = xdgDir "hifi/scripts" >>= createIfMissingPath