{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module HsDev.Tools.Ghc.Session (
        targetSession, interpretModule,

        module HsDev.Tools.Ghc.Worker
        ) where

import Control.Lens
import Data.Maybe (isJust)
import Data.Text (Text, unpack)
import System.Log.Simple

import Control.Concurrent.Worker
import System.Directory.Paths
import HsDev.Symbols.Types
import HsDev.Sandbox (getModuleOpts)
import HsDev.Tools.Ghc.Worker

import qualified GHC

-- | Session for module
targetSession :: [String] -> Module -> GhcM ()
targetSession opts m = do
        (pdbs, opts') <- getModuleOpts opts m
        ghcSession pdbs ("-Wall" : opts')

-- | Interpret file
interpretModule :: Module -> Maybe Text -> GhcM ()
interpretModule m mcts
        | isJust mpath = do
                let
                        rootDir = maybe (takeDir fpath) (view projectPath) (m ^? moduleId . moduleLocation . moduleProject . _Just)
                withCurrentDirectory (view path rootDir) $ do
                        t <- makeTarget (relPathTo rootDir fpath) mcts
                        loadTargets [t]
                        GHC.setContext [GHC.IIModule . GHC.mkModuleName . unpack . view (moduleId . moduleName) $ m]
        | otherwise = return ()
        where
                mpath = m ^? moduleId . moduleLocation . moduleFile
                Just fpath = mpath