{- This file is part of Vervis.
 -
 - Written in 2016 by fr33domlover <fr33domlover@riseup.net>.
 -
 - ♡ Copying is an act of love. Please copy, reuse and share.
 -
 - The author(s) have dedicated all copyright and related and neighboring
 - rights to this software to the public domain worldwide. This software is
 - distributed without any warranty.
 -
 - You should have received a copy of the CC0 Public Domain Dedication along
 - with this software. If not, see
 - <http://creativecommons.org/publicdomain/zero/1.0/>.
 -}

-- | Style component palette for use in page templates, in particular Cassius
-- files.
module Vervis.Style
    ( -- * Types
      Color ()
    , Hue ()
      -- * Plain Colors
    , black
    , white
    , plain
      -- * Color Hues
    , red
    , green
    , yellow
    , blue
    , magenta
    , cyan
    , gray
      -- * Hue to Color
    , dark
    , light
    )
where

import Prelude

import Text.Cassius (ToCss (..))

import qualified Text.Cassius as C (Color (Color))

data Lightness = Light | Dark

data Color
    = Black
    | Red Lightness
    | Green Lightness
    | Yellow Lightness
    | Blue Lightness
    | Magenta Lightness
    | Cyan Lightness
    | Gray Lightness
    | White
    | PlainText

instance ToCss Color where
    toCss col =
        let c r g b = toCss $ C.Color r g b
        in  case col of
                Black         -> c 0x00 0x00 0x00
                Red Dark      -> c 0xCC 0x00 0x00
                Red Light     -> c 0xEF 0x29 0x29
                Green Dark    -> c 0x4E 0x9A 0x06
                Green Light   -> c 0x8A 0xE2 0x34
                Yellow Dark   -> c 0xC4 0xA0 0x00
                Yellow Light  -> c 0xFC 0xE9 0x4F
                Blue Dark     -> c 0x34 0x65 0xA4
                Blue Light    -> c 0x73 0x9F 0xCF
                Magenta Dark  -> c 0x75 0x50 0x7B
                Magenta Light -> c 0xAD 0x7F 0xA8
                Cyan Dark     -> c 0x06 0x98 0x9A
                Cyan Light    -> c 0x34 0xE2 0xE2
                Gray Dark     -> c 0x55 0x57 0x53
                Gray Light    -> c 0xD3 0xD7 0xCF
                White         -> c 0xEE 0xEE 0xEC
                PlainText     -> c 0xCC 0xCC 0xCC

newtype Hue = Hue (Lightness -> Color)

black, white, plain :: Color
black = Black
white = White
plain = PlainText

red, green, yellow, blue, magenta, cyan, gray :: Hue
red     = Hue Red
green   = Hue Green
yellow  = Hue Yellow
blue    = Hue Blue
magenta = Hue Magenta
cyan    = Hue Cyan
gray    = Hue Gray

dark :: Hue -> Color
dark (Hue h) = h Dark

light :: Hue -> Color
light (Hue h) = h Light