{-# LANGUAGE RecordWildCards #-}

module System.Console.CmdArgs.Implicit.Reform(reform) where

import System.Console.CmdArgs.Implicit.Local
import System.Console.CmdArgs.Implicit.Type
import System.Console.CmdArgs.Verbosity

import Data.Generics.Any
import Data.List
import Data.Maybe


reform :: Prog_ -> CmdArgs Any -> Maybe [String]
reform Prog_{..} CmdArgs{..} = Just $
    f "help" progHelpArg (isJust cmdArgsHelp) ++
    f "version" progVersionArg (isJust cmdArgsVersion) ++
    f "verbose" (fst progVerbosityArgs) (cmdArgsVerbosity == Just Loud) ++
    f "quiet" (snd progVerbosityArgs) (cmdArgsVerbosity == Just Quiet)
    where
        f ex (Just x) True = pickArg $ builtinNames x ++ [ex]
        f _ _ _ = []


pickArg :: [String] -> [String]
pickArg xs = case partition ((==) 1 . length) xs of
    (_, x:_) -> ["--" ++ x]
    (x:_, _) -> ["-" ++ x]
    _ -> []

{-

data Prog_ = Prog_
    {progModes :: [Mode_]
    ,progSummary :: Maybe [String]
    ,progProgram :: String
    ,progHelp :: String -- only for multiple mode programs
    ,progVerbosityArgs :: (Maybe Builtin_, Maybe Builtin_)
    ,progHelpArg :: Maybe Builtin_
    ,progVersionArg :: Maybe Builtin_
    } deriving Show
-}