{- |
Module      :  ./Common/ProverTools.hs
Description :  Check for availability of provers
Copyright   :  (c) Dminik Luecke, and Uni Bremen 2008
License     :  GPLv2 or higher, see LICENSE.txt

Maintainer  :  luecke@informatik.uni-bremen.de
Stability   :  provisional
Portability :  portable

check for provers
-}

module Common.ProverTools where

import Common.Utils

import System.Directory
import System.FilePath

executableWithDefault :: String -> String -> IO String
executableWithDefault ex def = do
  mPath <- findExecutable ex
  case mPath of
    Nothing -> return def
    Just _ -> return ex

missingExecutableInPath :: String -> IO Bool
missingExecutableInPath name = do
  mp <- findExecutable name
  case mp of
    Nothing -> return True
    Just name' -> do
      p1 <- check4File (takeFileName name') "PATH" ()
      p2 <- check4File (takeFileName name') "Path" ()
      return . null $ p1 ++ p2

check4FileAux :: String -- ^ file name
              -> String -- ^ Environment Variable
              -> IO [String]
check4FileAux name env = do
      pPath <- getEnvDef env ""
      let path = "" : splitPaths pPath
      exIT <- mapM (doesFileExist . (</> name)) path
      return $ map fst $ filter snd $ zip path exIT

-- | Checks if a file exists in PATH
checkBinary :: String -> IO (Maybe String)
checkBinary name = fmap
  (\ l -> if null l
          then Just $ "missing binary in $PATH: " ++ name
          else Nothing)
  $ check4FileAux name "PATH"

-- | Checks if a file exists
check4File :: String -- ^ file name
           -> String -- ^ Environment Variable
           -> a
           -> IO [a]
check4File name env a = do
      ex <- check4FileAux name env
      return [a | not $ null ex ]

-- | check for java and the jar file in the directory of the variable
check4jarFile :: String -- ^ environment Variable
  -> String -- ^ jar file name
  -> IO (Bool, FilePath)
check4jarFile = check4jarFileWithDefault ""

check4jarFileWithDefault
  :: String -- ^ default path
  -> String -- ^ environment Variable
  -> String -- ^ jar file name
  -> IO (Bool, FilePath)
check4jarFileWithDefault def var jar = do
  pPath <- getEnvDef var def
  hasJar <- doesFileExist $ pPath </> jar
  return (hasJar, pPath)

-- | environment variable for HETS_OWL_TOOLS
hetsOWLenv :: String
hetsOWLenv = "HETS_OWL_TOOLS"

-- | check for the jar file under HETS_OWL_TOOLS
check4HetsOWLjar :: String -- ^ jar file name
  -> IO (Bool, FilePath)
check4HetsOWLjar = check4jarFileWithDefault "OWL2" hetsOWLenv

checkOWLjar :: String -> IO (Maybe String)
checkOWLjar name =
  fmap (\ (b, p) -> if b then Nothing else
       Just $ "missing jar ($" ++ hetsOWLenv ++ "): " ++ (p </> name))
  $ check4HetsOWLjar name
