module Rattletrap.Console.Config where

import qualified Rattletrap.Console.Flag as Flag
import qualified Rattletrap.Console.Mode as Mode
import qualified System.FilePath as FilePath

data Config = Config
  { Config -> Bool
compact :: Bool
  , Config -> Bool
fast :: Bool
  , Config -> Bool
help :: Bool
  , Config -> Maybe String
input :: Maybe String
  , Config -> Maybe Mode
mode :: Maybe Mode.Mode
  , Config -> Maybe String
output :: Maybe String
  , Config -> Bool
schema :: Bool
  , Config -> Bool
skipCrc :: Bool
  , Config -> Bool
version :: Bool
  }
  deriving (Config -> Config -> Bool
(Config -> Config -> Bool)
-> (Config -> Config -> Bool) -> Eq Config
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Config -> Config -> Bool
$c/= :: Config -> Config -> Bool
== :: Config -> Config -> Bool
$c== :: Config -> Config -> Bool
Eq, Int -> Config -> ShowS
[Config] -> ShowS
Config -> String
(Int -> Config -> ShowS)
-> (Config -> String) -> ([Config] -> ShowS) -> Show Config
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Config] -> ShowS
$cshowList :: [Config] -> ShowS
show :: Config -> String
$cshow :: Config -> String
showsPrec :: Int -> Config -> ShowS
$cshowsPrec :: Int -> Config -> ShowS
Show)

initial :: Config
initial :: Config
initial = Config :: Bool
-> Bool
-> Bool
-> Maybe String
-> Maybe Mode
-> Maybe String
-> Bool
-> Bool
-> Bool
-> Config
Config
  { compact :: Bool
compact = Bool
False
  , fast :: Bool
fast = Bool
False
  , help :: Bool
help = Bool
False
  , input :: Maybe String
input = Maybe String
forall a. Maybe a
Nothing
  , mode :: Maybe Mode
mode = Maybe Mode
forall a. Maybe a
Nothing
  , output :: Maybe String
output = Maybe String
forall a. Maybe a
Nothing
  , schema :: Bool
schema = Bool
False
  , skipCrc :: Bool
skipCrc = Bool
False
  , version :: Bool
version = Bool
False
  }

applyFlag :: Config -> Flag.Flag -> Either String Config
applyFlag :: Config -> Flag -> Either String Config
applyFlag Config
config Flag
flag = case Flag
flag of
  Flag
Flag.Compact -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { compact :: Bool
compact = Bool
True }
  Flag
Flag.Fast -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { fast :: Bool
fast = Bool
True }
  Flag
Flag.Help -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { help :: Bool
help = Bool
True }
  Flag.Input String
x -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { input :: Maybe String
input = String -> Maybe String
forall a. a -> Maybe a
Just String
x }
  Flag.Mode String
x -> do
    Mode
y <- String -> Either String Mode
Mode.fromString String
x
    Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { mode :: Maybe Mode
mode = Mode -> Maybe Mode
forall a. a -> Maybe a
Just Mode
y }
  Flag.Output String
x -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { output :: Maybe String
output = String -> Maybe String
forall a. a -> Maybe a
Just String
x }
  Flag
Flag.Schema -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { schema :: Bool
schema = Bool
True }
  Flag
Flag.SkipCrc -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { skipCrc :: Bool
skipCrc = Bool
True }
  Flag
Flag.Version -> Config -> Either String Config
forall a b. b -> Either a b
Right Config
config { version :: Bool
version = Bool
True }

getMode :: Config -> Mode.Mode
getMode :: Config -> Mode
getMode Config
config =
  let
    i :: Maybe String
i = ShowS -> Maybe String -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ShowS
FilePath.takeExtension (Maybe String -> Maybe String) -> Maybe String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Config -> Maybe String
input Config
config
    o :: Maybe String
o = ShowS -> Maybe String -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ShowS
FilePath.takeExtension (Maybe String -> Maybe String) -> Maybe String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Config -> Maybe String
output Config
config
  in case (Maybe String
i, Maybe String
o) of
    (Just String
".json", Maybe String
_) -> Mode
Mode.Encode
    (Just String
".replay", Maybe String
_) -> Mode
Mode.Decode
    (Maybe String
_, Just String
".json") -> Mode
Mode.Decode
    (Maybe String
_, Just String
".replay") -> Mode
Mode.Encode
    (Maybe String, Maybe String)
_ -> Mode
Mode.Decode