module Propellor.Debug where

import Control.Monad.IfElse
import System.IO
import System.Log.Logger
import System.Log.Formatter
import System.Log.Handler (setFormatter)
import System.Log.Handler.Simple
import Control.Applicative
import Prelude

import Utility.Monad
import Utility.Env
import Utility.Exception
import Utility.Process
import Utility.Directory

debug :: [String] -> IO ()
debug :: [String] -> IO ()
debug = String -> String -> IO ()
debugM "propellor" (String -> IO ()) -> ([String] -> String) -> [String] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords

checkDebugMode :: IO ()
checkDebugMode :: IO ()
checkDebugMode = Maybe String -> IO ()
go (Maybe String -> IO ()) -> IO (Maybe String) -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< String -> IO (Maybe String)
getEnv "PROPELLOR_DEBUG"
  where
	go :: Maybe String -> IO ()
go (Just "1") = IO ()
enableDebugMode
	go (Just _) = IO ()
forall (m :: * -> *). Monad m => m ()
noop
	go Nothing = IO Bool -> IO () -> IO ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (String -> IO Bool
doesDirectoryExist ".git") (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
		IO Bool -> IO () -> IO ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM (String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem "1" ([String] -> Bool) -> (String -> [String]) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines (String -> Bool) -> IO String -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO String
getgitconfig) IO ()
enableDebugMode
	getgitconfig :: IO String
getgitconfig = String -> IO String -> IO String
forall (m :: * -> *) a. MonadCatch m => a -> m a -> m a
catchDefaultIO "" (IO String -> IO String) -> IO String -> IO String
forall a b. (a -> b) -> a -> b
$
		String -> [String] -> IO String
readProcess "git" ["config", "propellor.debug"]

enableDebugMode :: IO ()
enableDebugMode :: IO ()
enableDebugMode = do
	GenericHandler Handle
f <- GenericHandler Handle
-> LogFormatter (GenericHandler Handle) -> GenericHandler Handle
forall a. LogHandler a => a -> LogFormatter a -> a
setFormatter
		(GenericHandler Handle
 -> LogFormatter (GenericHandler Handle) -> GenericHandler Handle)
-> IO (GenericHandler Handle)
-> IO
     (LogFormatter (GenericHandler Handle) -> GenericHandler Handle)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Handle -> Priority -> IO (GenericHandler Handle)
streamHandler Handle
stderr Priority
DEBUG
		IO (LogFormatter (GenericHandler Handle) -> GenericHandler Handle)
-> IO (LogFormatter (GenericHandler Handle))
-> IO (GenericHandler Handle)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> LogFormatter (GenericHandler Handle)
-> IO (LogFormatter (GenericHandler Handle))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> LogFormatter (GenericHandler Handle)
forall a. String -> LogFormatter a
simpleLogFormatter "[$time] $msg")
	String -> (Logger -> Logger) -> IO ()
updateGlobalLogger String
rootLoggerName ((Logger -> Logger) -> IO ()) -> (Logger -> Logger) -> IO ()
forall a b. (a -> b) -> a -> b
$ 
		Priority -> Logger -> Logger
setLevel Priority
DEBUG (Logger -> Logger) -> (Logger -> Logger) -> Logger -> Logger
forall b c a. (b -> c) -> (a -> b) -> a -> c
.  [GenericHandler Handle] -> Logger -> Logger
forall a. LogHandler a => [a] -> Logger -> Logger
setHandlers [GenericHandler Handle
f]