module Gargantext.Components.Corpus.EditionBlock
  ( editionBlock
  ) where

import Gargantext.Prelude

import Data.Maybe (Maybe(..), isJust)
import Data.Tuple.Nested ((/\))
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.Corpus.CodeSection (loadCorpus')
import Gargantext.Components.Node (NodePoly(..))
import Gargantext.Components.Nodes.Corpus.Types (CorpusInfo(..), Hyperdata(..), getCorpusInfo)
import Gargantext.Components.Table (tableHeaderEditionBlock)
import Gargantext.Config.REST (logRESTError)
import Gargantext.Hooks.Loader (useLoaderEffect)
import Gargantext.Hooks.Session (useSession)
import Gargantext.Types (ID)
import Gargantext.Utils.Reactix as R2
import Reactix as R
import Reactix.DOM.HTML as H
import Toestand as T

type Props =
  ( nodeId :: ID
  )

here :: R2.Here
here = R2.here "Gargantext.Components.Corpus.EditionBlock"

editionBlock :: R2.Leaf Props
editionBlock = R2.leaf editionBlockCpt
editionBlockCpt :: R.Component Props
editionBlockCpt = here.component "main" cpt where
  cpt { nodeId
      } _ = do
    -- | States
    -- |
    session <- useSession

    state' /\ state <- R2.useBox' Nothing

    -- | Computed
    -- |
    let
      errorHandler = logRESTError here "[corpusLayout]"

    -- | Hooks
    -- |
    useLoaderEffect
      { errorHandler
      , loader: loadCorpus'
      , path: { nodeId, session }
      , state
      }

    -- | Render
    -- |
    pure $

      B.cloak
      { isDisplayed: isJust state'
      , cloakSlot:

          -- (?) quick and dirty placeholder for the <tableHeaderEditionBlock>
          H.div
          { style:
            { width: "100%"
            , height: "136px"
            , position: "relative"
            }
          }
          [
            B.preloader
            {}
          ]

      , defaultSlot:
          R2.fromMaybe state' \hyperdata ->

            editionBlock_
            { nodeId
            , hyperdata
            }
      }

----------------------------------------------------------------


type Props_ =
  ( nodeId      :: ID
  , hyperdata   :: NodePoly Hyperdata
  )

editionBlock_ :: R2.Leaf Props_
editionBlock_ = R2.leaf editionBlockCpt_
editionBlockCpt_ :: R.Component Props_
editionBlockCpt_ = here.component "main_" cpt where
  cpt { nodeId
      , hyperdata
      } _ = do
    -- | Computed
    -- |
    let
      NodePoly { name, date, hyperdata } = hyperdata

      Hyperdata h = hyperdata
      corpusInfo = getCorpusInfo h.fields

      CorpusInfo { title, desc, query, authors } = corpusInfo

    -- -- | States
    -- -- |
    corpusInfoS <- T.useBox corpusInfo

    session <- useSession

    -- -- | Render
    -- -- |
    pure $

      tableHeaderEditionBlock
      { hyperdata
      , nodeId
      , session
      , corpusInfoS
      , defaultData:
        { name
        , date
        , query
        , desc
        , title
        , authors
        }
      }