{-# LANGUAGE TemplateHaskell #-}
module Web.Mackerel.Types.Dashboard where

import Data.Aeson
import qualified Data.Aeson as Aeson
import Data.Aeson.TH (deriveJSON, fieldLabelModifier)
import Data.Aeson.Types (typeMismatch)
import Data.Char (toLower)
import qualified Data.Text as Text

import Web.Mackerel.Internal.TH

data DashboardId = DashboardId String
            deriving (Eq, Show)

instance FromJSON DashboardId where
  parseJSON (Aeson.String dashboardId') = return $ DashboardId $ Text.unpack dashboardId'
  parseJSON o = typeMismatch "DashboardId" o

instance ToJSON DashboardId where
  toJSON (DashboardId dashboardId') = toJSON dashboardId'

data DashboardCreate
  = DashboardCreate {
    dashboardCreateTitle :: String,
    dashboardCreateBodyMarkdown :: String,
    dashboardCreateUrlPath :: String
  } deriving (Eq, Show)

$(deriveJSON options { fieldLabelModifier = (\(c:cs) -> toLower c : cs) . drop 15 } ''DashboardCreate)

data Dashboard
  = Dashboard {
    dashboardId :: DashboardId,
    dashboardTitle :: String,
    dashboardBodyMarkdown :: String,
    dashboardUrlPath :: String
  } deriving (Eq, Show)

$(deriveJSON options ''Dashboard)