{- Graphics.Vega.VegaLite.Theme
Gregory W. Schwartz

Theme for professional publication-quality figures.
-}

{-# LANGUAGE OverloadedStrings #-}

module Graphics.Vega.VegaLite.Theme
  ( theme
  ) where

-- Remote
import Graphics.Vega.VegaLite
import qualified Data.Text as T

-- Local

data Config = Config { configFontSize :: Double
                     , configFont :: T.Text
                     , configLabelFont :: T.Text
                     , configAxisColor :: T.Text
                     , configHeight :: Double
                     , configWidth :: Double
                     }

defaultConfig :: Config
defaultConfig = Config { configFontSize = 12
                       , configFont = "Arial"
                       , configLabelFont = "Arial"
                       , configAxisColor = "#000000"
                       , configHeight = 300
                       , configWidth = 400
                       }

theme :: Config -> [LabelledSpec] -> (VLProperty, VLSpec)
theme c = configure
        . configuration (View $ viewConfig c)
        . configuration (Legend $ legendConfig c)
        . configuration (TitleStyle $ titleConfig c)
        . configuration (Axis $ axisConfig c)
        . configuration (AxisX $ axisConfig c)
        . configuration (AxisY $ axisConfig c)

viewConfig :: Config -> [ViewConfig]
viewConfig c = [ ViewHeight (configHeight c)  -- 80 for publishing
               , ViewWidth (configWidth c)  -- 100 for publishing
               , StrokeOpacity 0  -- Despine
               ]

legendConfig :: Config -> [LegendConfig]
legendConfig c = [ LeLabelFontSize (configFontSize c)
                 , LeTitleFontSize (configFontSize c)
                 ]

titleConfig :: Config -> [TitleConfig]
titleConfig c = [ TFontSize (configFontSize c)
                , TFont (configFont c)
                , TColor "#000000"
                , TFontWeight Normal
                ]

axisConfig :: Config -> [AxisConfig]
axisConfig c = [ Grid False
               , DomainColor "#000000"
               , LabelFont (configLabelFont c)
               , LabelFontSize (configFontSize c)
               , LabelAngle 0
               , TickColor (configAxisColor c)
               , TitleFont (configFont c)
               , TitleFontSize (configFontSize c)
               , TitleFontWeight Normal
               ]