{-# LANGUAGE OverloadedStrings #-}

-- | Some types shared along the library.
module Text.LaTeX.Base.Types (
   ClassName
 , PackageName
 , PageStyle
 , Label
 , createLabel , labelName
 , Pos (..) , HPos (..)
 , TableSpec (..)
 , Measure (..)
 ) where

import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Render

-- | Class names are represented by a 'String'.
type ClassName = String

-- | Package names are represented by a 'String'.
type PackageName = String

-- | Page styles are represented by a 'String'.
type PageStyle = String

-- | Type of labels.
newtype Label = Label String deriving (Eq, Show)

-- | Create a label from its name.
createLabel :: String -> Label
createLabel = Label

-- | Get the name of a label.
labelName :: Label -> String
labelName (Label str) = str

instance Render Label where
    render (Label str) = fromString str

instance IsString Label where
    fromString = createLabel

-- | Vertical position. 'Here' and 'ForcePos' are used with @table@ environments.
data Pos = Bottom | Center | Top | Here | ForcePos deriving Show

instance Render Pos where
 render Bottom   = "b"
 render Center   = "c"
 render Top      = "t"
 render Here     = "h"
 render ForcePos = "!"

-- | Horizontal position.
data HPos = HLeft | HCenter | HRight deriving Show

instance Render HPos where
 render HLeft   = "l"
 render HCenter = "c"
 render HRight  = "r"

-- | Type of table specifications.
data TableSpec =
   LeftColumn         -- ^ Left-justified column.
 | CenterColumn       -- ^ Centered column.
 | RightColumn        -- ^ Right-justified column.
 | ParColumnTop LaTeX -- ^ Paragraph column with text vertically aligned at the top.
 | ParColumnMid LaTeX -- ^ Paragraph column with text vertically aligned at the middle. Requires 'array' package.
 | ParColumnBot LaTeX -- ^ Paragraph column with text vertically aligned at the bottom. Requires 'array' package.
 | NameColumn String  -- ^ User defined column. Requires 'array' package.
 | BeforeColumn LaTeX -- ^ Can be used before a 'LeftColumn', 'CenterColumn', 'RightColumn', 'ParColumnTop', 'ParColumnMid' or a 'ParColumnBot' specification. Inserts the code directly in front of the entry of the column. Requires 'array' package.
 | AfterColumn LaTeX  -- ^ Can be used after a 'LeftColumn', 'CenterColumn', 'RightColumn', 'ParColumnTop', 'ParColumnMid' or a 'ParColumnBot' specification. Inserts the code directly in front of the entry of the column. Requires 'array' package.
 | VerticalLine       -- ^ Vertical line between two columns.
 | DVerticalLine      -- ^ Double vertical line between two columns.
 | Separator LaTeX    -- ^ Column separator. Requires 'array' package.
   deriving Show

instance Render TableSpec where
 render LeftColumn       = "l"
 render CenterColumn     = "c"
 render RightColumn      = "r"
 render (ParColumnTop l) = "p" <> render (FixArg l)
 render (ParColumnMid l) = "m" <> render (FixArg l)
 render (ParColumnBot l) = "b" <> render (FixArg l)
 render (NameColumn n)   = fromString n
 render (BeforeColumn l) = ">{" <> render l <> "}"
 render (AfterColumn l)  = "<{" <> render l <> "}"
 render VerticalLine     = "|"
 render DVerticalLine    = "||"
 render (Separator l)    = "@" <> render (FixArg l)