module Main where

import UI
import Control.Exception (displayException, try)
import Control.Monad (void, when)
import Data.Functor (($>))
import Data.Version (showVersion)
import Paths_hascard (version)
import Parser
import Options.Applicative
import System.Process (runCommand)
import System.FilePath (takeExtension)

data Opts = Opts
  { optFile    :: Maybe String
  , optVersion :: Bool
  }

main :: IO ()
main = do
  useEscapeCode <- getUseEscapeCode
  when useEscapeCode $ void (runCommand "echo -n \\\\e[5 q")
  
  options <- execParser optsWithHelp
  if optVersion options
    then putStrLn (showVersion version)
    else run $ optFile options

opts :: Parser Opts
opts = Opts
  <$> optional (argument str (metavar "FILE.txt" <> help "A .txt file containing flashcards"))
  <*> switch (long "version" <> short 'v' <> help "Show version number")

optsWithHelp :: ParserInfo Opts
optsWithHelp = info (opts <**> helper) $
              fullDesc <> progDesc "Run the normal application without argument, or run it directly on a deck of flashcards by providing a text file."
              <> header "Hascard - a TUI for reviewing notes"

run :: Maybe String -> IO ()
run Nothing = runBrickFlashcards
run (Just file) = do
  let filepath = 
        case takeExtension file of
          ""     -> Just $ file <> ".txt"
          ".txt" -> Just file
          _      -> Nothing
  case filepath of
     Nothing -> putStrLn "Incorrect file type, provide a .txt file" 
     Just textfile -> do
       valOrExc <- try (readFile textfile) :: IO (Either IOError String)
       case valOrExc of
         Left exc -> putStrLn (displayException exc)
         Right val -> case parseCards val of
           Left parseError -> print parseError
           Right result -> addRecent textfile *> runCardsUI result $> ()