{-# LANGUAGE OverloadedStrings #-}

module Text.LaTeX.LambdaTeX.Reference where

import Text.LaTeX.Base.Class
import Text.LaTeX.Base.Syntax

import qualified Text.LaTeX.Base.Commands as H
       (label, pageref, ref)

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

-- * Internal references
-- An internal references point is defined by a label
-- It is then referenced with @ref label@
--
-- ΛTeX automatically ensures that those references are always internally consistent
-- BUT you have to make sure that you use these functions instead of the regular ones.
-- ** Labels
-- | Label a part
label :: Monad m => Text -> ΛTeXT m ()
label l = do
    fromLaTeX $ H.label $ TeXRaw l
    addLabelMade l

-- | The safe version of LaTeX's @ref@
ref :: Monad m => Text -> ΛTeXT m ()
ref l = do
    fromLaTeX $ H.ref $ TeXRaw l
    addLabelNeeded l

-- | The safe version of LaTeX's @pageref@
pageref :: Monad m => Text -> ΛTeXT m ()
pageref l = do
    fromLaTeX $ H.pageref $ TeXRaw l
    addLabelNeeded l

-- * External references
-- ** Defining references
-- TODO(kerckhove) Check for duplicate fields?
-- | Define an external reference.
--   Use 'cite' or 'nocite' to use this in your document.
makeReference :: ReferenceType -> Text -> [(Text, Text)] -> Reference
makeReference = Reference

-- ** Using references
-- | Refer to an external reference.
cite :: Monad m => Reference -> ΛTeXT m ()
cite rf = do
    fromLaTeX $ comm1 "cite" $ TeXRaw $ referenceName rf
    addReference rf

-- | Put an external reference in your list of references without using it.
nocite :: Monad m => Reference -> ΛTeXT m ()
nocite rf = do
    fromLaTeX $ comm1 "nocite" $ TeXRaw $ referenceName rf
    addReference rf

-- ** Reference Types
--
-- See [The Wiki article on which fields each of them requires](https://en.wikibooks.org/wiki/LaTeX/Bibliography_Management)
--
-- TODO(kerckhove) Generate these!
unpublished :: ReferenceType
unpublished = "unpublished"

lectureSlides :: ReferenceType
lectureSlides = "unpublished"

online :: ReferenceType
online = "online"

article :: ReferenceType
article = "article"