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

import Data.Aeson
import Data.Aeson.Types
import Control.Applicative
import Data.Text (Text)
import Control.Lens.TH
import Data.Maybe (fromMaybe)

import Web.Slack.Types.Id
import Web.Slack.Types.Time
import Web.Slack.Types.Topic
import {-# SOURCE #-} Web.Slack.Types.ChannelOpt (ChannelOpt)
import Prelude

data Channel = Channel { _channelId         :: ChannelId
                       , _channelName       :: Text
                       , _channelCreated    :: Time
                       , _channelCreator    :: UserId
                       , _channelIsArchived :: Maybe Bool
                       , _channelIsGeneral  :: Bool
                       , _channelMembers    :: Maybe [UserId]
                       , _channelTopic      :: Maybe Topic
                       , _channelPurpose    :: Maybe Purpose
                       , _channelIsMember   :: Bool
                       , _channelOpt        :: Maybe ChannelOpt
                       , _channelIsGroup    :: Bool
                       } deriving Show

makeLenses ''Channel

defaultToFalse :: Object -> Text -> Parser Bool
defaultToFalse o tag = fmap (fromMaybe False) $ o .:? tag

instance FromJSON Channel where
  parseJSON = withObject "Channel" (\o -> Channel <$> o .: "id" <*> o .: "name"
                                                  <*> o .: "created" <*> o .:"creator"
                                                  <*> o .:? "is_archived" <*> defaultToFalse o "is_general"
                                                  <*> o .:? "members" <*> o .:? "topic"
                                                  <*> o .:? "purpose" <*> defaultToFalse o "is_member"
                                                  <*> (pure $ parseMaybe parseJSON (Object o) :: Parser (Maybe ChannelOpt))
                                                  <*> o .:? "is_group" .!= False)