module Options where

import System.Console.GetOpt
import RawFiles
import IO
import System

data Flag = Verbose | Output String  | External | WriteFiles | InstDerivs
    deriving(Eq)

putErrLn = hPutStrLn stderr

options :: [OptDescr Flag]
options =
     [ Option ['v']     ["verbose"]  (NoArg Verbose)         "chatty output on stderr"
     , Option ['o']     ["output"]   (ReqArg Output "FILE")  "output FILE"
     , Option []        ["monad"]    (NoArg InstDerivs)         "declare a Derivs instance for your parser"
     , Option ['e']     []           (NoArg External)        "use external pappy files"
     , Option []        ["write-files"] (NoArg WriteFiles)   "create pappy files in the current directory"
     ]

putVerboseLn s  = do
    (fs,_,_) <- processArgs
    if Verbose `notElem` fs then return () else putErrLn s

isStandalone = do
    (fs,_,_) <- processArgs
    return (External `notElem` fs)

processArgs = do
    argv <- getArgs
    let printUsage err =  putErrLn (err ++ usageInfo header options) >> exitFailure
        header = "Usage: pappy [OPTIONS ..] Input.pappy"
        mkoutname inname = case reverse inname of
            'y':'p':'p':'a':'p':'.':inr -> reverse inr ++ ".hs"
            _ -> inname ++ ".hs"
    case getOpt Permute options argv of
        (o,_,[]) | WriteFiles `elem` o  -> do
            writeFile "PappyParse.hs" pappyparse_hs
            writeFile "PappyPos.hs" pappypos_hs
            exitWith ExitSuccess
        (o,[infile],[]) -> return (o,infile,head $ [ fs | Output fs <- o ] ++ [mkoutname infile])
        (o,[],[]) -> printUsage "No pappy file specified\n"
        (_,_,errs) -> printUsage (concat errs)


