{-# LANGUAGE OverloadedStrings, RankNTypes #-}
module Settings where
import Brick
import Brick.Forms
import UI.BrickHelpers
import Data.Char (isDigit)
import States
import Data.Maybe
import System.FilePath ((</>))
import System.Environment (lookupEnv)
import Text.Read (readMaybe)
import Lens.Micro.Platform
import qualified Data.Text as T
import qualified Graphics.Vty as V
import qualified System.Directory as D

getShowHints :: IO Bool
getShowHints = do
  settings <- getSettings
  return $ settings ^. hints

getShowControls :: IO Bool
getShowControls = do
  settings <- getSettings
  return $ settings ^. controls

getUseEscapeCode :: IO Bool
getUseEscapeCode = do
  settings <- getSettings
  return $ settings ^. escapeCode

getMaxRecents :: IO Int
getMaxRecents = do
  settings <- getSettings
  return $ settings ^. maxRecents

getSettings :: IO Settings
getSettings = do
  sf <- getSettingsFile
  exists <- D.doesFileExist sf
  if exists
    then do
      maybeSettings <- parseSettings <$> readFile sf
      maybe (return defaultSettings) return maybeSettings
  else return defaultSettings

parseSettings :: String -> Maybe Settings
parseSettings = readMaybe

getSettingsFile :: IO FilePath
getSettingsFile = do
  maybeSnap <- lookupEnv "SNAP_USER_DATA"
  xdg <- D.getXdgDirectory D.XdgConfig "hascard"

  let dir = case maybeSnap of
                Just path | not (null path) -> path
                          | otherwise       -> xdg
                Nothing                     -> xdg
  D.createDirectoryIfMissing True dir
  return (dir </> "settings")

defaultSettings :: Settings
defaultSettings = FormState { _hints=False, _controls=True, _escapeCode=False, _maxRecents=5}

setSettings :: Settings -> IO ()
setSettings settings = do
  sf <- getSettingsFile
  writeFile sf (show settings)

settingsState :: IO State
settingsState = SettingsState . mkForm <$> getSettings

mkForm :: Settings -> Form Settings e Name
mkForm =
  let label s w = padBottom (Pad 1) $ padRight (Pad 2) (strWrap s) <+> w

  in newForm
    [ label "Draw hints using underscores for definition cards" @@= yesnoField False hints HintsField ""
    , label "Show controls at the bottom of screen" @@= yesnoField False controls ControlsField ""
    , label "Use the '-n \\e[5 q' escape code to change the cursor to a blinking line on start" @@= yesnoField False escapeCode EscapeCodeField ""
    , label "Maximum number of recently selected files stored" @@= naturalNumberField 999 maxRecents MaxRecentsField "" ]