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

Target: just import this module and nothing else to work with
Gargantext's database.

TODO: configure nodes table in Haskell (Config typenames etc.)
-}


{-# OPTIONS_GHC -fno-warn-orphans        #-}

module Gargantext.Database.Admin.Config
    where

import Control.Lens     (view)
import Data.List        (lookup)
import Data.Maybe       (fromMaybe)
import Data.Text        (Text,pack)
import Data.Tuple.Extra (swap)
import Gargantext.Core (HasDBid(..))
import Gargantext.Database.Admin.Types.Node
import Gargantext.Database.Schema.Node
import Gargantext.Prelude

-- TODO put this in config.ini file
corpusMasterName :: Text
corpusMasterName = "Main"

userMaster :: Text
userMaster = "gargantua"

userArbitrary :: Text
userArbitrary = "user1"

instance HasDBid NodeType where
  toDBid  = nodeTypeId
  fromDBid = fromNodeTypeId


nodeTypeId :: NodeType -> NodeTypeId
nodeTypeId n =
  case n of
    NodeUser          -> 1
    NodeFolder        -> 2
    NodeFolderPrivate -> 20
    NodeFolderShared  -> 21
    NodeTeam          -> 210
    NodeFolderPublic  -> 22
    NodeCorpusV3      -> 3
    NodeCorpus        -> 30
    NodeAnnuaire      -> 31
    NodeTexts         -> 40
    NodeDocument      -> 4
    NodeContact       -> 41
  --NodeSwap   -> 19

----  Lists
    NodeList      -> 5
    NodeListCooc  -> 50
    NodeModel -> 52

----  Scores
--    NodeOccurrences -> 10
    NodeGraph       -> 9
    NodePhylo       -> 90
--    NodeChart       -> 7
    NodeDashboard   -> 71
--    NodeNoteBook    -> 88

    NodeFile        -> 101

    Notes    -> 991
    Calc     -> 992
    NodeFrameNotebook -> 993
    NodeFrameVisio    -> 994

--  Cooccurrences -> 9
--
--  Specclusion  -> 11
--  Genclusion   -> 18
--  Cvalue       -> 12
--
--  TfidfCorpus  -> 13
--  TfidfGlobal  -> 14
--
--  TirankLocal  -> 16
--  TirankGlobal -> 17

--  Node management
--  NodeFavorites    -> 15

hasNodeType :: forall a. Node a -> NodeType -> Bool
hasNodeType n nt = (view node_typename n) == (toDBid nt)

isInNodeTypes :: forall a. Node a -> [NodeType] -> Bool
isInNodeTypes n ts = elem (view node_typename n) (map toDBid ts)

-- | Nodes are typed in the database according to a specific ID
--
nodeTypeInv :: [(NodeTypeId, NodeType)]
nodeTypeInv = map swap nodeTypes

nodeTypes :: [(NodeType, NodeTypeId)]
nodeTypes = [ (n, toDBid n) | n <- allNodeTypes ]

fromNodeTypeId :: NodeTypeId -> NodeType
fromNodeTypeId tId = fromMaybe (panic $ pack $ "Type Id " <> show tId <> " does not exist")
                               (lookup tId nodeTypeInv)
