{-# 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}