module Yesod.Goodies.PNotify.Modules.Buttons
       ( Buttons(..)
       , defaultButtons
       )where

import Data.Aeson
import Data.Text (Text)

import Yesod.Goodies.PNotify.Types
import Yesod.Goodies.PNotify.Types.Instances

data Labels = Labels { _close :: Maybe Text
                     , _stick :: Maybe Text
                     }
              deriving (Read, Show, Eq, Ord)

instance FromJSON Labels where
  parseJSON (Object v) = Labels <$>
                         v .:? "close" <*>
                         v .:? "stick"

instance ToJSON Labels where
  toJSON (Labels { _close
                 , _stick
                 })
      = object $ maybe [] (\x -> ["close" .= x]) _close ++
                 maybe [] (\x -> ["stick" .= x]) _stick ++
                 []

data Buttons = Buttons { _closer            :: Maybe Bool
                       , _closer_hover      :: Maybe Bool
                       , _sticker           :: Maybe Bool
                       , _sticker_hover     :: Maybe Bool
                       , _show_on_nonblock  :: Maybe Bool
                       , _labels            :: Maybe Labels
                       }
               deriving (Read, Show, Eq, Ord)

instance FromJSON Buttons where
  parseJSON (Object v) = Buttons <$>
                         v .:? "closer" <*>
                         v .:? "closer_hover" <*>
                         v .:? "sticker" <*>
                         v .:? "sticker_hover" <*>
                         v .:? "show_on_nonblock" <*>
                         v .:? "labels"

instance ToJSON Buttons where
  toJSON (Buttons { _closer
                  , _closer_hover
                  , _sticker
                  , _sticker_hover
                  , _show_on_nonblock
                  , _labels
                  })
      = object $ maybe [] (\x -> ["closer" .= x]) _closer ++
                 maybe [] (\x -> ["closer_hover" .= x]) _closer_hover ++
                 maybe [] (\x -> ["sticker" .= x]) _sticker ++
                 maybe [] (\x -> ["sticker_hover" .= x]) _sticker_hover ++
                 maybe [] (\x -> ["show_on_nonblock" .= x]) _show_on_nonblock ++
                 maybe [] (\x -> ["labels" .= x]) _labels ++
                 []

defaultButtons :: Buttons
defaultButtons = Buttons
                 { _closer             = Nothing
                 , _closer_hover       = Nothing
                 , _sticker            = Nothing
                 , _sticker_hover      = Nothing
                 , _show_on_nonblock   = Nothing
                 , _labels             = Nothing
                 }