module Gargantext.Components.Forest.Tree.Node.Action where

import Gargantext.Prelude

import Data.Maybe (Maybe(..))
import Effect.Aff (Aff)
import Gargantext.Components.Forest.Tree.Node.Action.Types (Action(..))
import Gargantext.Components.Forest.Tree.Node.Settings (NodeAction(..), glyphiconNodeAction)
import Gargantext.Components.Forest.Tree.Node.Tools.FTree (ID)
import Gargantext.Components.Forest.Tree.Node.Tools.SubTree.Types (SubTreeOut, SubTreeParams(..))
import Gargantext.Sessions (Session)
import Gargantext.Types as GT

type Props =
  ( dispatch :: Action -> Aff Unit
  , id       :: ID
  , nodeType :: GT.NodeType
  , session  :: Session
  )

subTreeOut :: Action -> Maybe SubTreeOut
subTreeOut (MoveNode    {params}) = params
subTreeOut (MergeNode   {params}) = params
subTreeOut (LinkNode    {params}) = params
subTreeOut (SharePublic {params}) = params
subTreeOut _                    = Nothing

setTreeOut ::  Action -> Maybe SubTreeOut -> Action
setTreeOut (MoveNode  {params:_}) p = MoveNode  {params: p}
setTreeOut (MergeNode {params:_}) p = MergeNode {params: p}
setTreeOut (LinkNode  {nodeType, params:_}) p = LinkNode  {nodeType, params: p}
setTreeOut (SharePublic {params:_}) p = SharePublic  {params: p}
setTreeOut a   _             = a

-----------------------------------------------------------------------
icon :: Action -> String
icon (AddNode    _ _)            = glyphiconNodeAction (Add [])
icon (DeleteNode _)              = glyphiconNodeAction Delete
icon (RenameNode _)              = glyphiconNodeAction Config
icon (UpdateNode _)              = glyphiconNodeAction ReloadWithSettings
icon (ShareTeam   _)             = glyphiconNodeAction Share
icon (AddContact  _)             = glyphiconNodeAction Share
icon (SharePublic _ )            = glyphiconNodeAction (Publish { subTreeParams : SubTreeParams {showtypes:[], valitypes:[] }})
icon (DoSearch   _)              = glyphiconNodeAction SearchBox
icon (UploadFile _ _ _ _ _ _ _)  = glyphiconNodeAction Upload
icon (UploadArbitraryFile _ _ _) = glyphiconNodeAction Upload
icon (UploadFrameCalc _ _)       = glyphiconNodeAction Upload
icon  RefreshTree                = glyphiconNodeAction Refresh
icon  CloseBox                   = glyphiconNodeAction CloseNodePopover
icon  DownloadNode               = glyphiconNodeAction Download
icon (MoveNode _ )               = glyphiconNodeAction (Move  { subTreeParams : SubTreeParams {showtypes:[], valitypes:[] }})
icon (MergeNode _ )              = glyphiconNodeAction (Merge { subTreeParams : SubTreeParams {showtypes:[], valitypes:[] }})
icon (LinkNode _  )              = glyphiconNodeAction (Link  { subTreeParams : SubTreeParams {showtypes:[], valitypes:[] }})
icon (DocumentsFromWriteNodes _) = glyphiconNodeAction (WriteNodesDocuments)
icon NoAction                    = "hand-o-right"

-- icon _             = "hand-o-right"

text :: Action -> String
text (AddNode     _ _    )        = "Add!"
text (DeleteNode _       )        = "Delete!"
text (RenameNode  _      )        = "Rename!"
text (UpdateNode  _      )        = "Update!"
text (ShareTeam   _      )        = "Share with team!"
text (AddContact  _      )        = "Add contact!"
text (SharePublic _      )        = "Publish!"
text (DoSearch    _      )        = "Launch search!"
text (UploadFile _ _ _ _ _ _ _)   = "Upload File!"
text (UploadArbitraryFile _ _ _)  = "Upload arbitrary file!"
text (UploadFrameCalc _ _)        = "Upload frame calc"
text  RefreshTree                 = "Refresh Tree!"
text  CloseBox                    = "Close Box!"
text DownloadNode                 = "Download!"
text (MoveNode  _ )               = "Move!"
text (MergeNode _ )               = "Merge!"
text (LinkNode  _ )               = "Link!"
text (DocumentsFromWriteNodes _ ) = "Documents from Write Nodes!"
text NoAction                     = "No Action"
-----------------------------------------------------------------------