module EnvStatus.Output.Render where

import Control.Applicative ((<$>))
import Data.ConfigFile (ConfigParser)
import Data.Maybe (fromMaybe, isJust)

import EnvStatus.Config
import EnvStatus.Output.Types
import EnvStatus.Process

strip :: String -> String
strip s = reverse $ removeSpace $ reverse $ removeSpace s
  where
    removeSpace :: String -> String
    removeSpace (' ':rest) = removeSpace rest
    removeSpace ('\n':rest) = removeSpace rest
    removeSpace noSpaces = noSpaces

renderTokenString :: ConfigParser -> [Token] -> IO String
renderTokenString cp tokens = do
  results <- sequence $ renderToken cp <$> tokens
  return $ unwords results

renderToken :: ConfigParser -> Token -> IO String
renderToken _ (Raw s) = pure s
renderToken cp (SubCommand c) = do
  let cmd = getConfigValue cp $ strip c
  if isJust cmd
    then strip <$> runCommandAsync (fromMaybe "" cmd)
    else return ("### Command not found for config key " ++ c ++ " ###")