{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Grafana.Plugin.PieChart where

import Data.Aeson (ToJSON(..))
import Data.Aeson ((.=), Value(..))
import Data.Map.Strict (Map)
import Data.Text (Text)

import qualified Data.Aeson as AE

import Grafana

data PieType = Donut | Pie

instance ToJSON PieType where
  toJSON = \case
    Donut -> "donut"
    Pie -> "pie"

data PieChart = PieChart
  { pieChartTitle :: Text
  , pieChartQueries :: [GraphiteQuery]
  , pieChartUnit :: Maybe UnitFormat
  , pieChartAliasColors :: Map Text RGBA
  , pieType :: PieType
  }

pieChartToPairs :: PieChart -> [(Text, AE.Value)]
pieChartToPairs (PieChart {..}) =
  [ "type" .= String "grafana-piechart-panel"
  , "title" .= pieChartTitle
  , "targets" .= makeTargets pieChartQueries
  , "format" .= pieChartUnit
  , "pieType" .= pieType
  , "aliasColors" .= pieChartAliasColors
  ]

pieChartPanel :: PieChart -> GridPos -> Panel
pieChartPanel = Panel . pieChartToPairs