{-|
Module      : Gargantext.Database.Metrics.TFICF
Description : Ngrams by Node user and master
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX

-}

{-# LANGUAGE QuasiQuotes       #-}

module Gargantext.Database.Action.Metrics.TFICF
  where

-- import Debug.Trace (trace)
-- import Gargantext.Core (Lang(..))
import Data.Map.Strict (Map, toList, fromList)
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Gargantext.Core.Text.Metrics.TFICF
import Gargantext.Database.Action.Metrics.NgramsByNode (getNodesByNgramsUser, getOccByNgramsOnlyFast)
import Gargantext.Database.Admin.Types.Node -- (ListId, CorpusId, NodeId)
import Gargantext.Database.Prelude (Cmd)
import Gargantext.Database.Query.Table.NodeNode (selectCountDocs)
import Gargantext.Database.Schema.Ngrams (NgramsType(..))
import Gargantext.Prelude
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set

getTficf :: UserCorpusId
         -> MasterCorpusId
         -> NgramsType
         -> Cmd err (Map Text Double)
getTficf cId mId nt = do
  mapTextDoubleLocal <- Map.filter (> 1)
     <$> Map.map (fromIntegral . Set.size)
     <$> getNodesByNgramsUser cId nt

  mapTextDoubleGlobal <- Map.map fromIntegral
                     <$> getOccByNgramsOnlyFast mId nt (Map.keys mapTextDoubleLocal)

  countLocal  <- selectCountDocs cId
  countGlobal <- selectCountDocs mId

  pure $ fromList [ ( t
                    , tficf (TficfInfra (Count n                                               )
                                        (Total $ fromIntegral countLocal ))
                            (TficfSupra (Count $ fromMaybe 0 $ Map.lookup t mapTextDoubleGlobal)
                                        (Total $ fromIntegral countGlobal))
                    )
                  | (t, n) <- toList mapTextDoubleLocal
                  ]