module Text.Tabular.Latex where

import Data.List (intersperse)
import Text.Tabular


render :: (rh -> String)
       -> (ch -> String)
       -> (a -> String)
       -> Table rh ch a -> String
render = renderUsing (repeat "r")

renderUsing :: [String] -- ^ column header specifications including label (l,h,p{3cm},etc)
            -> (rh -> String)
            -> (ch -> String)
            -> (a -> String) -> Table rh ch a -> String
renderUsing cols fr fc f (Table rh ch cells) =
 unlines $ ( "\\begin{tabular}{" ++ hspec ++ "}")
         : [ addTableNl header
           , hline
           , (concatMap (either vAttr addTableNl) $
              flattenHeader $ fmap row $ zipHeader [] cells $ fmap fr rh)
           , "\\end{tabular}" ]
 where
  ch2 = Group DoubleLine [(Header ""),fmap fc ch]
  hspec  = concatMap (either hAttr fst) $ flattenHeader
         $ zipHeader "" cols ch2
  header = texCols . map label . headerContents $ ch2
  --
  row (cs,h) = texCols $ label h : map f cs
  texCols  = concat . intersperse " & "
  texRows  = map addTableNl
  rhStrings = headerContents rh


hline :: String
hline = "\\hline"

addTableNl :: String -> String
addTableNl = (++ "\\\\\n")

label :: String -> String
label s = "\\textbf{" ++ s ++ "}"

hAttr :: Properties -> String
hAttr NoLine     = ""
hAttr SingleLine = "|"
hAttr DoubleLine = "||"

vAttr :: Properties -> String
vAttr NoLine     = ""
vAttr SingleLine = hline
vAttr DoubleLine = hline ++ hline