{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
module Web.Slack.Types.Group where

import Data.Aeson
import Data.Aeson.Types
import Control.Lens.TH
import Web.Slack.Types.Id
import Web.Slack.Types.Time
import Web.Slack.Types.Topic
import {-# SOURCE #-} Web.Slack.Types.ChannelOpt (ChannelOpt)

import Control.Applicative

import Data.Text (Text)

data Group = Group
           { _groupId         :: GroupId
           , _groupName       :: Text
           , _groupCreated    :: Time
           , _groupCreator    :: UserId
           , _groupIsArchived :: Bool
           , _groupIsOpen     :: Bool
           , _groupMembers    :: [UserId]
           , _groupTopic      :: Topic
           , _groupPurpose    :: Purpose
           , _groupOpt        :: Maybe ChannelOpt
           , _groupIsGroup    :: Bool
           } deriving (Show)

makeLenses ''Group

instance FromJSON Group where
  parseJSON = withObject "Group" (\o ->
               Group <$> o .: "id" <*> o .: "name"
                <*> o .: "created" <*> o .: "creator"
                <*> o .: "is_archived" <*> o .: "is_open"
                <*> o .: "members" <*> o .: "topic"
                <*> o .: "purpose"
                <*> (pure $ parseMaybe parseJSON (Object o) :: Parser (Maybe ChannelOpt))
                <*> o .: "is_group")