module Options.Harg.Pretty
  ( ppHelp
  , ppSourceRunErrors
  ) where

import Control.Applicative        ((<|>))
import Data.List                  (intercalate)
import Data.Maybe                 (fromMaybe)

import Options.Harg.Sources.Types
import Options.Harg.Types


ppHelp
  :: Opt a
  -> Maybe String
ppHelp Opt{..}
  = (<> ppEnvVar _optEnvVar) <$> _optHelp

ppSourceRunErrors
  :: [SourceRunError]
  -> String
ppSourceRunErrors
  = intercalate "\n\n"
  . map ppSourceRunError
  where
    ppSourceRunError :: SourceRunError -> String
    ppSourceRunError (SourceRunError Nothing src desc)
      =  "error: "
      <> desc
      <> "\n\t"
      <> ppSource src

    ppSourceRunError (SourceRunError (Just (SomeOpt opt)) src desc)
      =  "option "
      <> optId opt
      <> ": "
      <> desc
      <> "\n\t"
      <> ppSource src
      <> ppEnvVar (_optEnvVar opt)

    optId Opt{..}
      = fromMaybe "<no name available>"
        $ _optLong <|> (pure <$> _optShort) <|> _optMetavar

ppSource
  :: String
  -> String
ppSource s
  = " (source: " <> s <> ")"

ppEnvVar
  :: Maybe String
  -> String
ppEnvVar
  = maybe "" $ \s -> " (env var: " <> s <> ")"