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

Theme for professional publication-quality figures.
-}

{-# LANGUAGE OverloadedStrings #-}

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

-- Remote
import Data.Maybe (catMaybes)
import Graphics.Vega.VegaLite
import qualified Data.Text as T

-- Local

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

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

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

viewConfig :: Config -> [ViewConfig]
viewConfig c = catMaybes
                 [ fmap ViewContinuousHeight (configHeight c)  -- 80 for publishing
                 , fmap ViewContinuousWidth (configWidth c)  -- 100 for publishing
                 , Just $ ViewStrokeOpacity 0  -- Despine
                 ]

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

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

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