module Data.Config.Font where

import Control.Lens
import Data.Aeson
import qualified Data.Text as T
import Data.Word (Word8)
import MiniLight
import qualified SDL.Font
import qualified SDL.Vect as Vect

data Config = Config {
  descriptor :: FontDescriptor,
  size :: Int,
  color :: Vect.V4 Word8
}

makeLensesWith classyRules_ ''Config

instance FromJSON Config where
  parseJSON = withObject "font" $ \v -> do
    family <- v .:? "family" .!= ""
    size <- v .:? "size" .!= 0
    bold <- v .:? "bold" .!= False
    italic <- v .:? "italic" .!= False
    [r,g,b,a] <- v .:? "color" .!= [0, 0, 0, 255]

    return $ Config (FontDescriptor family (FontStyle bold italic)) size (Vect.V4 r g b a)

-- | Load a system font from 'Config' type.
loadFontFrom :: Config -> MiniLight SDL.Font.Font
loadFontFrom conf = loadFont (descriptor conf) (size conf)

-- | Create a text texture from the config.
-- **NB** This function is a slow operation since it loads the font data every time.
textFrom :: Config -> T.Text -> MiniLight Figure
textFrom conf t = do
  font <- loadFontFrom conf
  text font (conf ^. _color) t