module Gargantext.Components.GraphExplorer.API where

import Data.Maybe (Maybe)
import Effect.Aff (Aff)
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.NgramsTable.Core as NTC
import Gargantext.Hooks.Sigmax.Types as SigmaxT
import Gargantext.Prelude
import Gargantext.Routes as GR
import Gargantext.Sessions (Session, get, post)
import Gargantext.Types as GT

type GraphAsyncUpdateParams =
  (
    graphId :: Int
  , listId :: Int
  , nodes :: Array (Record SigmaxT.Node)
  , session :: Session
  , termList :: GT.TermList
  , version :: NTC.Version
  )

graphAsyncUpdate :: Record GraphAsyncUpdateParams -> Aff GT.AsyncTaskWithType
graphAsyncUpdate {graphId, listId, nodes, session, termList, version} = do
  task <- post session p q
  pure $ GT.AsyncTaskWithType { task, typ: GT.GraphT }
  where
    p = GR.GraphAPI graphId $ GT.asyncTaskTypePath GT.GraphT
    q = { listId
        , nodes
        , termList
        , version
        }

type GraphAsyncRecomputeParams =
  (
    graphId :: Int
  , session :: Session
  )

graphAsyncRecompute :: Record GraphAsyncRecomputeParams -> Aff GT.AsyncTaskWithType
graphAsyncRecompute { graphId, session } = do
  task <- post session p q
  pure $ GT.AsyncTaskWithType { task, typ: GT.GraphT }
  where
    p = GR.GraphAPI graphId $ GT.asyncTaskTypePath GT.GraphT
    q = {}

type QueryProgressParams =
  (
    graphId :: Int
  , session :: Session
  , taskId  :: String
  )

queryProgress :: Record QueryProgressParams -> Aff GT.AsyncProgress
queryProgress { graphId, session, taskId } = do
  get session $ GR.GraphAPI graphId $ "async/" <> taskId <> "/poll"

type GraphVersions =
  (
    gv_graph :: Maybe Int
  , gv_repo :: Int
  )

type GraphVersionsParams =
  (
    graphId :: Int
  , session :: Session
  )

graphVersions :: Record GraphVersionsParams -> Aff (Record GraphVersions)
graphVersions { graphId, session }  = get session $ GR.GraphAPI graphId $ "versions"

type UpdateGraphVersionsParams =
  (
    graphId :: Int
  , session :: Session
  )

updateGraphVersions :: Record UpdateGraphVersionsParams -> Aff GET.GraphData
updateGraphVersions { graphId, session } = post session (GR.GraphAPI graphId $ "versions") {}