{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}

module Database.Bolt.Extras.Query.Delete
  (
    deleteNodes
  ) where

import           Control.Monad                  (forM)
import           Control.Monad.IO.Class         (MonadIO)
import           Data.Text                      (Text, intercalate, pack)
import           Database.Bolt                  (BoltActionT, RecordValue (..),
                                                 at, exact, query)
import           Database.Bolt.Extras.Persisted (BoltId, fromInt)
import           NeatInterpolation              (text)

-- | 'deleteNodes' is used to delete all nodes with given 'BoltId's
-- and all corresponding relatioships.
--
deleteNodes :: (MonadIO m) => [BoltId] -> BoltActionT m [BoltId]
deleteNodes boltIds = do
    records <- query formQuery
    forM records $ \record -> do
      nodeIdentity' <- record `at` varQ >>= exact
      pure $ fromInt nodeIdentity'
  where
    varQ = "n"

    formBoltIds :: Text
    formBoltIds = intercalate ", " $ fmap (pack . show) boltIds

    formQuery = [text|MATCH ($varQ)
                      WHERE ID($varQ) IN [$formBoltIds]
                      DETACH DELETE $varQ
                      RETURN ID($varQ) as $varQ|]