module Language.Haskell.GhcMod.Debug (debugInfo, rootInfo) where

import Control.Applicative ((<$>))
import Data.List (intercalate)
import Data.Maybe (isJust, fromJust)
import Language.Haskell.GhcMod.Convert
import Language.Haskell.GhcMod.Monad
import Language.Haskell.GhcMod.Types
import Language.Haskell.GhcMod.Internal

----------------------------------------------------------------

-- | Obtaining debug information.
debugInfo :: IOish m => GhcModT m String
debugInfo = cradle >>= \c -> convert' =<< do
    CompilerOptions gopts incDir pkgs <-
        if isJust $ cradleCabalFile c then
            fromCabalFile c ||> simpleCompilerOption
          else
            simpleCompilerOption
    return [
        "Root directory:      " ++ cradleRootDir c
      , "Current directory:   " ++ cradleCurrentDir c
      , "Cabal file:          " ++ show (cradleCabalFile c)
      , "GHC options:         " ++ unwords gopts
      , "Include directories: " ++ unwords incDir
      , "Dependent packages:  " ++ intercalate ", " (map showPkg pkgs)
      , "System libraries:    " ++ ghcLibDir
      ]
  where
    simpleCompilerOption = options >>= \op ->
        return $ CompilerOptions (ghcUserOptions op) [] []
    fromCabalFile c = options >>= \opts -> do
        pkgDesc <- parseCabalFile c $ fromJust $ cradleCabalFile c
        getCompilerOptions (ghcUserOptions opts) c pkgDesc

----------------------------------------------------------------

-- | Obtaining root information.
rootInfo :: IOish m => GhcModT m String
rootInfo = convert' =<< cradleRootDir <$> cradle