content: {-|
  
  The help command.
  
  |-}
  --TODO rename manuals
  --TODO substring matching
  
  {-# LANGUAGE PackageImports #-}
  {-# LANGUAGE QuasiQuotes #-}
  {-# LANGUAGE TemplateHaskell #-}
  
  module Hledger.Cli.Commands.Help (
  
     helpmode
    ,help'
  
    ) where
  
  import Data.Maybe
  import Safe (headMay)
  import System.Console.CmdArgs.Explicit
  import System.Environment
  import System.IO
  
  import Hledger.Cli.CliOptions
  import Hledger.Cli.DocFiles
  import Hledger.Data.RawOptions
  import Hledger.Data.Types
  import Hledger.Utils (embedFileRelative)
  --import Hledger.Utils.Debug
  
  helpmode = hledgerCommandMode
    $(embedFileRelative "Hledger/Cli/Commands/Help.txt")
    -- The help-* names avoid a clash with the --info and --man flags handled in Cli.hs.
    [flagNone ["i"] (setboolopt "help-i")  "show the manual with info"
    ,flagNone ["m"] (setboolopt "help-m")   "show the manual with man"
    ,flagNone ["p"] (setboolopt "help-p") "show the manual with $PAGER or less\n(less is always used if TOPIC is specified)"
    ]
    [(helpflagstitle, helpflags)]
    []
    ([], Just $ argsFlag "[TOPIC]")
  
  -- | Display the hledger manual in various formats.
  -- You can select a docs viewer with one of the `--info`, `--man`, `--pager` flags.
  -- Otherwise it will use the first available of: info, man, $PAGER, less, stdout
  -- (and always stdout if output is non-interactive).
  help' :: CliOpts -> Journal -> IO ()
  help' opts _ = do
    exes <- likelyExecutablesInPath
    pagerprog <- fromMaybe "less" <$> lookupEnv "PAGER"
    interactive <- hIsTerminalDevice stdout
    let
      args = take 1 $ listofstringopt "args" $ rawopts_ opts
      mtopic = headMay args
      [info, man, pager, cat] =
        [runInfoForTopic, runManForTopic, runPagerForTopic, printHelpForTopic]
      viewer
        | boolopt "help-i" $ rawopts_ opts = info
        | boolopt "help-m" $ rawopts_ opts = man
        | boolopt "help-p" $ rawopts_ opts = pager
        | not interactive                  = cat
        | "info"    `elem` exes            = info
        | "man"     `elem` exes            = man
        | pagerprog `elem` exes            = pager
        | "less"    `elem` exes            = pager
        | otherwise                        = cat
  
    viewer "hledger" mtopic
  