{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE OverloadedStrings #-}

module Text.Authoring.Combinator.Cite where

import Control.Lens
import Control.Monad
import Control.Monad.State
import Control.Monad.Writer
import qualified Data.Set as Set
import qualified Data.Text as Text
import Text.CSL.Input.Identifier (resolve, HasDatabase)

import Text.Authoring.Class
import Text.Authoring.Combinator.Meta
import Text.Authoring.Combinator.Writer
import Text.Authoring.Document
import Text.Authoring.State


-- | Cite a list of documents
citet, citep :: MonadAuthoring s w m => [String] -> m ()

citet = citationGen "citet"
citep = citationGen "citep"

-- | Cite a single document
citet1, citep1 :: MonadAuthoring s w m => String -> m ()

citet1 = citationGen "citet" . (:[]) -- + ---<===   I am a long man lying
citep1 = citationGen "citep" . (:[]) -- + ---<===   We are long men lying

-- | make a citation to a document(s).
citationGen :: MonadAuthoring s w m => Text.Text -> [String] -> m ()
citationGen cmdName  urls = do
  forM_ urls $ \url -> do
    resolve url
    citedUrlSet %= Set.insert url 
  command1 cmdName $ braces $ raw $ Text.intercalate "," $ map Text.pack urls