{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
    
import Web.App
import Web.Scotty.Trans
import Options.Applicative
import Network.HTTP.Types (Status(..))
import Data.Text.Lazy (Text)
import qualified Data.ByteString.Lazy.Char8 as BL

instance WebAppState Integer where
  initState = return 0
  destroyState st = do
    putStr "Counted: "
    print st

main :: IO ()
main = webappMain app "My Web App" (Just parseUtil) handleUtil

app :: ScottyT Text (WebAppM Integer) ()
app = do
  get "/" $ do
    getState >>= raw . BL.pack . show
  
  get "/add" $ do
    modifyState ((+) 1)
    status $ Status 302 ""
    setHeader "Location" "/"
    
  get "/subtract" $ do
    count <- getState
    putState $ count-1
    status $ Status 302 ""
    setHeader "Location" "/"
    
  get "/assets/:file" $ param "file" >>= loadAsset
  
data Util = Password String
  
parseUtil :: Parser Util
parseUtil = subparser $ (mkcmd "password" "Hash a password" parsePassword)
  where
    parsePassword = Password <$> (strArgument $ metavar "PASSWORD" <> help "password to hash")
    mkcmd cmd desc p = command cmd $ info (helper <*> p) $ progDesc desc
    
handleUtil :: Util -> IO ()
handleUtil (Password str) = putStrLn str