{-# LANGUAGE OverloadedStrings #-}
module Text.LaTeX.LambdaTeX.Reference.Internal where

import qualified Data.Set                             as S
import qualified Data.Text                            as T

import           Text.LaTeX.LambdaTeX.Reference.Types
import           Text.LaTeX.LambdaTeX.Types

-- * Internal references

-- | Declare that a label has been made
addLabelMade ::  Monad m => Text -> ΛTeXT m ()
addLabelMade label = λtell $ mempty { outputLabelsMade = S.singleton label }

-- | Declare that a label is needed
addLabelNeeded ::  Monad m => Text -> ΛTeXT m ()
addLabelNeeded label = λtell $ mempty { outputLabelsNeeded = S.singleton label }

-- * External references

-- | Render references to bib(La)TeX format
renderReferences :: [Reference] -> Text
renderReferences rs = (`mappend` "\n\n") . T.intercalate ",\n\n" $ map showRef rs
  where
    showRef :: Reference -> Text
    showRef r = mconcat
        [
          "@"
        , referenceType r
        , "{"
        , referenceName r
        , ",\n"
        , T.intercalate ",\n" (map showField $ referenceFields r)
        , "\n}"
        ]

    showField :: (Text, Text) -> Text
    showField (a, b) = mconcat ["  ", a, " = {", b, "}"]

-- | Add a reference to a ΛTeX generator
addReference :: Monad m => Reference -> ΛTeXT m ()
addReference ref = λtell $ mempty { outputExternalReferences = S.singleton ref }