module Main where


import Graphics.Vty
import Graphics.Vty.CrossPlatform (mkVty)

mkUI :: (Bool, Bool, Bool, Bool, Bool, Bool) -> Maybe Event -> Image
mkUI (m, ms, p, ps, f, fs) e =
    vertCat [ string defAttr $ "Mouse mode supported: " <> show m
            , string defAttr $ "Mouse mode status: " <> show ms
            , string defAttr " "
            , string defAttr $ "Paste mode supported: " <> show p
            , string defAttr $ "Paste mode status: " <> show ps
            , string defAttr " "
            , string defAttr $ "Focus mode supported: " <> show f
            , string defAttr $ "Focus mode status: " <> show fs
            , string defAttr " "
            , string defAttr $ "Last event: " <> show e
            , string defAttr " "
            , string defAttr "Press 'm' to toggle mouse mode, 'p' to toggle paste mode,"
            , string defAttr "'f' to toggle focus mode, and 'q' to quit."
            ]

main :: IO ()
main = do
    vty <- mkVty defaultConfig

    let renderUI lastE = do
          let output = outputIface vty
          info <- (,,,,,) <$> (pure $ supportsMode output Mouse)
                        <*> getModeStatus output Mouse
                        <*> (pure $ supportsMode output BracketedPaste)
                        <*> getModeStatus output BracketedPaste
                        <*> (pure $ supportsMode output Focus)
                        <*> getModeStatus output Focus
          return $ picForImage $ mkUI info lastE

    let go lastE = do
          pic <- renderUI lastE
          update vty pic
          e <- nextEvent vty
          case e of
              EvKey (KChar 'q') [] -> return ()
              EvKey (KChar 'm') [] -> do
                  let output = outputIface vty
                  enabled <- getModeStatus output Mouse
                  setMode output Mouse (not enabled)
                  go (Just e)
              EvKey (KChar 'p') [] -> do
                  let output = outputIface vty
                  enabled <- getModeStatus output BracketedPaste
                  setMode output BracketedPaste (not enabled)
                  go (Just e)
              EvKey (KChar 'f') [] -> do
                  let output = outputIface vty
                  enabled <- getModeStatus output Focus
                  setMode output Focus (not enabled)
                  go (Just e)
              _ -> go (Just e)

    go Nothing
    shutdown vty