{-|
Module      : Gargantext.Database.Action.Delete
Description : 
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

TODO: right managements of nodes children of node Team
-- TODO add proper Right Management Type

TODO: NodeError

-}

module Gargantext.Database.Action.Delete
  where

import Gargantext.Core.Types.Individu (User(..))
import Gargantext.Database.Action.Flow.Utils (getUserId)
import Gargantext.Database.Admin.Config (hasNodeType)
import Gargantext.Database.Admin.Types.Node (NodeId)
import Gargantext.Database.Admin.Types.Node -- (NodeType(..))
import Gargantext.Database.Prelude (Cmd)
import Gargantext.Database.Query.Table.Node.Error (HasNodeError)
import Gargantext.Database.Schema.Node
import Gargantext.Prelude
import qualified Gargantext.Database.Query.Table.Node as N (getNode, deleteNode)
import Gargantext.Database.Action.Share (delFolderTeam)

deleteNode :: HasNodeError err 
           => User
           -> NodeId
           -> Cmd err Int
deleteNode u nodeId = do
  node' <- N.getNode nodeId
  if hasNodeType node' NodeUser
     then panic "Not allowed to delete NodeUser (yet)"
     else if hasNodeType node' NodeTeam
             then do
                uId   <- getUserId u
                if _node_userId node' == uId
                   then N.deleteNode    nodeId
                   else delFolderTeam u nodeId
             else N.deleteNode nodeId