{-|
Module      : Invitations.hs
Description : GarganText Mailing Invitations
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX


 -}

{-# LANGUAGE Strict            #-}

module CLI.Invitations where

import CLI.Parsers
import CLI.Types
import Control.Monad.Random (MonadRandom)
import Gargantext.API.Dev (withDevEnv, runCmdDev)
import Gargantext.API.Errors.Types
import Gargantext.API.Node () -- instances only
import Gargantext.API.Node.Share qualified as Share
import Gargantext.API.Node.Share.Types qualified as Share
import Gargantext.Core.Types
import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Prelude (IsDBCmdExtra)
import Gargantext.Prelude
import Options.Applicative
import Prelude (String)

invitationsCLI :: InvitationsArgs -> IO ()
invitationsCLI (InvitationsArgs settingsPath user node_id email) = do
  -- _cfg       <- readConfig settingsPath

  let invite :: (IsDBCmdExtra env BackendInternalError m, MonadRandom m)
             => m Int
      invite = Share.api (UserName $ cs user) node_id (Share.ShareTeamParams $ cs email)

  withDevEnv settingsPath $ \env -> do
    void $ runCmdDev env invite

invitationsCmd :: HasCallStack => Mod CommandFields CLI
invitationsCmd = command "invitations" (info (helper <*> fmap CLISub invitations_p) (progDesc "Mailing invitations."))

invitations_p :: Parser CLICmd
invitations_p = fmap CCMD_invitations $ InvitationsArgs
  <$> settings_p
  <*> ( strOption ( long "user" ) )
  <*> ( option (eitherReader node_p)  ( long "node-id" <> metavar "POSITIVE-INT" <> help "The node ID.") )
  <*> ( strOption ( long "email" <> help "The email address.") )

node_p :: String -> Either String NodeId
node_p i = case readMaybe i of
  Nothing -> Left $ i <> " is not a valid integer."
  Just xs
    | xs < 0 -> Left $ "The node id needs to be a positive integer."
    | otherwise
    -> Right $ UnsafeMkNodeId xs
