{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Hjugement.CLI where

import Control.Monad (Monad(..))
import Data.Bool
import Data.Function (($))
import Data.Semigroup (Semigroup(..))
import Data.Text (Text)
import Data.Void (Void)
import Symantic.CLI as CLI
import qualified Data.Text as Text
import qualified Data.Version as Version
import qualified Paths_hjugement_cli as Hjugement
import qualified Symantic.Document as Doc

import Hjugement.CLI.Utils
import Hjugement.CLI.Administrator
import Hjugement.CLI.Registrar
import Hjugement.CLI.Trustee
import Hjugement.CLI.Voter

progname :: Text
progname = "hjugement"

api =
	program "hjugement" $
		(api_options <?> api_agent) <!>
		api_help True <!>
		api_version
run =
	run_agent :!:
	run_help api :!:
	run_version

api_agent =
	rule "AGENT" $
		api_administrator <!>
		api_trustee <!>
		api_registrar <!>
		api_voter
run_agent params =
	run_administrator params :!:
	run_trustee params :!:
	run_registrar params :!:
	run_voter params

api_version =
	"Print the version."
	`helps`
	tag (TagLong "version") nothing
	<.> response @Doc
run_version =
	return (Doc.from version <> Doc.newline)
version :: Text
version =
	progname <> "-" <>
	Text.pack (Version.showVersion Hjugement.version)

parseAPI = parser @Void @Doc api run