module Config where

import Data.Monoid ((<>))
import Data.List (intercalate, foldl')
import Data.Version (showVersion)
import Options.Applicative hiding (style)

import Utils

import Paths_ploton (version)

data Config = Config
    { script    :: !String
    , dataFiles :: ![String]
    , term      :: !String
    , output    :: !String
    , setting   :: ![String]
    , xlabel    :: !(Maybe String)
    , ylabel    :: !(Maybe String)
    , xrange    :: !(Maybe String)
    , yrange    :: !(Maybe String)
    , xformat   :: !(Maybe String)
    , yformat   :: !(Maybe String)
    , title     :: !(Maybe String)
    , multi     :: !(Maybe String)
    , multiTitle :: !(Maybe String)
    , style     :: !String
    , color     :: !String
    , logx      :: !Bool
    , logy      :: !Bool
    , splot     :: !Bool
    , verbose   :: !Bool
    } deriving Show

getConfig :: IO Config
getConfig = execParser optsParser

optsParser :: ParserInfo Config
optsParser = info (versionInfo <*> helper <*> programOptions)
                  (fullDesc <> header "ploton")
    where
        versionInfo = abortOption (InfoMsg (showVersion version)) $
            long "version" <> help "Show version" <> hidden
        maybeStrOption mv lg =
            (\s -> if null s then Nothing else Just s) <$>
                strOption (metavar mv <> long lg <> value "" <> help mv)
        programOptions =
            Config <$> strArgument (metavar "SCRIPT" <> help "plot script")
                   <*> some (strArgument $ metavar "FILES"
                                         <> help "data ifles")
                   <*> strOption (metavar "FORMAT"
                                 <> long "term"
                                 <> value "pdf"
                                 <> help "output format"
                                 )
                   <*> strOption (metavar "OUTPUT"
                                 <> long "output"
                                 <> value "plot_result"
                                 <> help "output file name"
                                 )
                   <*> many (strOption (metavar "set ..."
                                       <> long "set"
                                       <> help "set options"
                                       ))
                   <*> maybeStrOption "xlabel" "xl"
                   <*> maybeStrOption "ylabel" "yl"
                   <*> maybeStrOption "xrange" "xr"
                   <*> maybeStrOption "yrange" "yr"
                   <*> maybeStrOption "xformat" "xf"
                   <*> maybeStrOption "yformat" "yf"
                   <*> maybeStrOption "title" "title"
                   <*> maybeStrOption "multi" "multi"
                   <*> maybeStrOption "multi title" "multi-title"
                   <*> strOption (metavar "style"
                                 <> long "style"
                                 <> value "linespoints"
                                 <> help "data style"
                                 )
                   <*> strOption (metavar "color map"
                                 <> long "color"
                                 <> value ""
                                 <> help "pm3d map color"
                                 )
                   <*> switch (long "logx" <> help "logx")
                   <*> switch (long "logy" <> help "logy")
                   <*> switch (short '3' <> long "splot" <> help "Use splot")
                   <*> switch (long "verbose" <> help "output gnuplot script")