----------------------------------------------------------------------
--
-- Module      :   
-- | a command line argument setup
--                  is a Main and starts with convenience
-- for information see https://github.com/pcapriotti/optparse-applicative
-- change the getAttr function to return Text
----------------------------------------------------------------------
  {-# LANGUAGE
  MultiParamTypeClasses
      , FlexibleInstances
      , FlexibleContexts
      , ScopedTypeVariables
      , OverloadedStrings
      , TypeFamilies

  #-}

module ShakeBake.CmdLineArgs where
import UniformBase
import Uniform.CmdLineArgs   -- from u2to 
  
import Foundational.CmdLineFlags 
-- import Foundational.SettingsPage 
import Foundational.MetaPage
-- import Options.Applicative.Builder()

-- | the command line arguments raw
--  number of args must correspond in order and number with the
--  command arguments described in the parser
data LitArgs = LitArgs
  {
   LitArgs -> Bool
draftSwitch -- x^ d
  , LitArgs -> Bool
privateSwitch -- x^ v
--   , publishSwitch  -- x^ p
--   , oldSwitch -- x^ o
--   , finishedSwitch -- x^ f 
  , LitArgs -> Bool
testSwitch  -- x^ t
  , LitArgs -> Bool
testNewSwitch -- x^ T -- test after delete to create all new
  , LitArgs -> Bool
quickSwitch -- x^ q
  , LitArgs -> Bool
serverSwitch -- x^ s 
  , LitArgs -> Bool
watchSwitch -- x^ w 
--   , uploadSwitch -- x^ u  -- not yet used  
         :: Bool
  , LitArgs -> String
locationDirArg -- x^ l 
        :: String
   } deriving (Int -> LitArgs -> ShowS
[LitArgs] -> ShowS
LitArgs -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LitArgs] -> ShowS
$cshowList :: [LitArgs] -> ShowS
show :: LitArgs -> String
$cshow :: LitArgs -> String
showsPrec :: Int -> LitArgs -> ShowS
$cshowsPrec :: Int -> LitArgs -> ShowS
Show)

cmdArgs :: Parser LitArgs
-- | strings which have no default result in enforced arguments
-- order and type of arguments must correspod to LitArgs
cmdArgs :: Parser LitArgs
cmdArgs  =  
  Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> LitArgs
LitArgs
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mod FlagFields Bool -> Parser Bool
switch (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"draft" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'd' 
        forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"include draft material, else only `publish`")
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"private" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'p' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help
            String
"include the private data, else only public"
          )
    -- <$> switch
    --       (long "publish" <> short 'p' <> help
    --         "include material ready to publish"
    --       )
    -- <*> switch (long "old" <> short 'o' <> help "include old material")
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"test" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
't' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help
            String
"use test data (site/dough), continue test, start server on port set"
          )
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"testComplete" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'T' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help
            String
"use test data (site/dough), complete test, start server on port set"
          )
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"quick" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'q' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help
            String
"produce only html, but not the (slow) pdf's"
          )
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"server" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
's' 
                -- <> value True   -- not working
                forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help String
"start a server on port set in siteHeader file")
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
        (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"watch" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'w' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help
          String
"start the watch of files for restarting bake"
        )
    forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>  forall s. IsString s => Mod OptionFields s -> Parser s
strOption
        (forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"location" forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'l' forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. HasValue f => a -> Mod f a
value String
"." forall a. Semigroup a => a -> a -> a
<> forall (f :: * -> *) a. String -> Mod f a
help 
            String
"the directory in which to find the settings file")
    -- <*> switch
    --     (long "upload" <> short 'u' <> help
    --       "upload to external server"
    --     )





parseArgs2input ::   Text -> Text -> ErrIO PubFlags
-- getting cmd line arguments, produces the input in the usable form
--  with a default value for the file name
-- the two text arguments are used in the cmd arg parse
-- is specific to the parser (and thus to the cmd line arguments

parseArgs2input :: Text -> Text -> ErrIO PubFlags
parseArgs2input   Text
t1 Text
t2 = do
  LitArgs
args1 <- Text -> Text -> ErrIO LitArgs
getArgsParsed Text
t1 Text
t2
  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
False forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadIO m => [Text] -> m ()
putIOwords [Text
"parseArgs2input: args found", forall a. PrettyStrings a => a -> Text
showPretty LitArgs
args1]
  Path Abs Dir
workingdir1 :: Path Abs Dir <- ErrIO (Path Abs Dir)
currentDir


  let flags1 :: PubFlags
flags1 = PubFlags { draftFlag :: Bool
draftFlag    = LitArgs -> Bool
draftSwitch LitArgs
args1
                        -- , publishFlag  = publishSwitch args1
                        --  , oldFlag      = oldSwitch args1
                         , privateFlag :: Bool
privateFlag  = LitArgs -> Bool
privateSwitch LitArgs
args1
                         , testFlag :: Bool
testFlag     = LitArgs -> Bool
testSwitch LitArgs
args1
                         , testNewFlag :: Bool
testNewFlag = LitArgs -> Bool
testNewSwitch LitArgs
args1
                         , quickFlag :: Bool
quickFlag    = LitArgs -> Bool
quickSwitch LitArgs
args1
                         , serverFlag :: Bool
serverFlag   = LitArgs -> Bool
serverSwitch LitArgs
args1
                         , watchFlag :: Bool
watchFlag    = LitArgs -> Bool
watchSwitch LitArgs
args1
                         , locationDir :: String
locationDir = LitArgs -> String
locationDirArg LitArgs
args1
                         -- perhaps wrong, could be site/dough?
                        -- ,  uploadFlag = uploadSwitch args1
                         }

--   let flags2 = if testFlag flags1
--         then flags1 { settingsFile = testdataDir </> settingsFileName }
--                     --  ,  PortNumber = sourceDirTest
--         else flags1

  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
False forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). MonadIO m => [Text] -> m ()
putIOwords [Text
"parseArgs2input:  inputs ", forall a. PrettyStrings a => a -> Text
showPretty PubFlags
flags1]
  forall (m :: * -> *) a. Monad m => a -> m a
return PubFlags
flags1



getArgsParsed :: Text -> Text -> ErrIO LitArgs
getArgsParsed :: Text -> Text -> ErrIO LitArgs
getArgsParsed  Text
t1 Text
t2 = do
        LitArgs
args <- forall a. IO a -> ErrIO a
callIO forall a b. (a -> b) -> a -> b
$ forall a. ParserInfo a -> IO a
execParser ParserInfo LitArgs
opts
        forall (m :: * -> *) a. Monad m => a -> m a
return LitArgs
args
    where
        opts :: ParserInfo LitArgs
opts  = forall a. Parser a -> InfoMod a -> ParserInfo a
info (forall a. Parser (a -> a)
helper forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser LitArgs
cmdArgs)
                  (forall a. InfoMod a
fullDesc forall a. Semigroup a => a -> a -> a
<> (forall a. String -> InfoMod a
progDesc forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s forall a b. (a -> b) -> a -> b
$ Text
t1) forall a. Semigroup a => a -> a -> a
<> (forall a. String -> InfoMod a
header forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
t2s forall a b. (a -> b) -> a -> b
$ Text
t2))