-- | This Module provides the RecurringChild type with
-- FromJSON and ToJSON instances.
module Taskwarrior.RecurringChild
  ( RecurringChild(..)
  , parseFromObjectMay
  , toPairs
  )
where

import           Control.Applicative            ( optional )
import           Data.Aeson                     ( Object
                                                , (.:)
                                                , (.=)
                                                , ToJSON
                                                , FromJSON
                                                , pairs
                                                , object
                                                , withObject
                                                )
import qualified Data.Aeson                    as Aeson
import           Data.Aeson.Types               ( Parser
                                                , Pair
                                                )
import           Data.Text                      ( Text )
import           Data.UUID                      ( UUID )

-- | The 'RecurringChild' type saves information about how a 'Taskwarrior.Task.Task'
-- is child of another 'Taskwarrior.Task.Task' wich is recurring.
data RecurringChild =
  RecurringChild {
  recur :: Text,
  imask :: Integer,
  parent :: UUID }
  deriving (Eq, Show, Read, Ord)

-- | Gathers all fields for a 'RecurringChild' status.
parseFromObjectMay :: Object -> Parser (Maybe RecurringChild)
parseFromObjectMay = optional . parseFromObject

parseFromObject :: Object -> Parser RecurringChild
parseFromObject o =
  RecurringChild <$> o .: "recur" <*> o .: "imask" <*> o .: "parent"

-- | Can be used to serialize 'RecurringChild' to JSON.
toPairs :: RecurringChild -> [Pair]
toPairs RecurringChild {..} =
  ["recur" .= recur, "imask" .= imask, "parent" .= parent]

instance FromJSON RecurringChild where
  parseJSON = withObject "RecurringChild" parseFromObject

instance ToJSON RecurringChild where
  toJSON     = object . toPairs
  toEncoding = pairs . mconcat . map (uncurry (.=)) . toPairs