{-|
Module      : Gargantext.API.Node.Phylo.Export
Description : Phylo export
Copyright   : (c) CNRS, 2017-Present
License     : AGPL + CECILL v3
Maintainer  : team@gargantext.org
Stability   : experimental
Portability : POSIX
-}

module Gargantext.API.Node.Phylo.Export
  where

import Data.Aeson
import Data.Text qualified as T
import Gargantext.API.Prelude (GargNoServer, IsGargServer)
import Gargantext.API.Routes.Named.Viz qualified as Named
import Gargantext.Core.Viz.Phylo.API.Tools
import Gargantext.Core.Viz.Phylo.Example (phyloCleopatre)
import Gargantext.Database.Admin.Types.Node (PhyloId, NodeId,)
import Gargantext.Prelude
import Servant
import Servant.Server.Generic (AsServerT)

api :: IsGargServer env err m
    => NodeId
    -- ^ The ID of the target user
    -> PhyloId
    -> Named.PhyloExportAPI (AsServerT m)
api userNodeId dId = Named.PhyloExportAPI $ Named.PhyloExportEndpoints
  { exportPhyloJSONEp = getPhyloJson userNodeId dId
  , exportPhyloDotEp  = getPhyloDot userNodeId dId
  }

getPhyloJson  :: NodeId
                -- ^ The ID of the target user
              -> PhyloId
              -> GargNoServer (Headers '[Header "Content-Disposition" T.Text] Value)
getPhyloJson _ pId = do
  maybePhyloData <- getPhyloData pId
  let phyloData = fromMaybe phyloCleopatre maybePhyloData
  phyloJson <- liftBase $ phylo2dot2json phyloData
  pure $ addHeader (T.concat [ "attachment; filename="
                                          , "GarganText_Phylo-"
                                          , T.pack (show pId)
                                          , ".json" ])
                                          phyloJson


getPhyloDot :: NodeId
            -> PhyloId
            -> GargNoServer (Headers '[Header "Content-Disposition" T.Text] T.Text)
getPhyloDot _ pId = do
  maybePhyloData <- getPhyloData pId
  let phyloData = fromMaybe phyloCleopatre maybePhyloData
  phyloDot <- liftBase $ phylo2dot phyloData
  pure $ addHeader (T.concat [ "attachment; filename="
                                          , "GarganText_Phylo-"
                                          , T.pack (show pId)
                                          , ".dot" ])
                                          phyloDot
