{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

import Core.Program
import Core.Text
import TechniqueUser
  ( commandCheckTechnique,
    commandFormatTechnique,
  )

#ifdef __GHCIDE__
version :: Version
version = "0"
#else
version :: Version
version = $(fromPackage)
#endif

main :: IO ()
main = do
  context <-
    configure
      version
      None
      ( complex
          [ Command
              "check"
              "Syntax- and type-check the given procedure"
              [ Option
                  "watch"
                  Nothing
                  Empty
                  [quote|
                Watch the given procedure file and recompile if changes are detected.
              |],
                Argument
                  "filename"
                  [quote|
                The file containing the code for the procedure you want to type-check.
              |]
              ],
            Command
              "format"
              "Format the given procedure"
              [ Option
                  "raw-control-chars"
                  (Just 'R')
                  Empty
                  [quote|
                Emit ANSI escape codes for syntax highlighting even if output
                is redirected to a pipe or file.
              |],
                Argument
                  "filename"
                  [quote|
                The file containing the code for the procedure you want to format.
              |]
              ]
          ]
      )
  executeWith context program

program :: Program None ()
program = do
  params <- getCommandLine
  case commandNameFrom params of
    Nothing -> do
      write "Illegal state?"
      terminate 2
    Just command -> case command of
      "check" -> commandCheckTechnique
      "format" -> commandFormatTechnique
      _ -> do
        write "Unknown command?"
        terminate 3
  event "Done"
