{-# LANGUAGE OverloadedStrings #-}

module Network.Syncthing.Types.SystemMsg
    ( SystemMsg(..)
    ) where

import           Control.Applicative ((<$>))
import           Control.Monad       (MonadPlus (mzero))
import           Data.Aeson          (FromJSON, Value (..), parseJSON, (.:))
import           Data.Maybe          (fromMaybe)
import           Data.Text           (Text)


-- | System messages.
data SystemMsg
    = Restarting
    | ShuttingDown
    | ResettingFolders
    | OtherSystemMsg Text
    deriving (Eq, Show)

instance FromJSON SystemMsg where
    parseJSON (Object v) = decodeSystemMsg <$> (v .: "ok")
    parseJSON _          = mzero

decodeSystemMsg :: Text -> SystemMsg
decodeSystemMsg msg = fromMaybe (OtherSystemMsg msg) maybeMsg
  where 
    maybeMsg = lookup msg
        [ ("restarting",        Restarting)
        , ("shutting down",     ShuttingDown)
        , ("resetting folders", ResettingFolders)
        ]