{-# LANGUAGE OverloadedStrings, TemplateHaskell, RankNTypes,
 FunctionalDependencies, MultiParamTypeClasses, FlexibleInstances #-}
module Web.Slack.Types.Session where

import Control.Applicative
import Data.Aeson
import Web.Slack.Types.User
import Web.Slack.Types.Time
import Web.Slack.Types.Self
import Web.Slack.Types.Team
import Web.Slack.Types.Channel
import Web.Slack.Types.Group
import Web.Slack.Types.IM
import Web.Slack.Types.Bot
import Data.Text (Text)
import Control.Lens.TH
import Prelude

data SlackSession = SlackSession
                { _slackSelf          :: Self
                , _slackTeam          :: Team
                , _slackUsers         :: [User]
                , _slackLatestEventTs :: SlackTimeStamp
                , _slackChannels      :: [Channel]
                , _slackGroups        :: [Group]
                , _slackIms           :: [IM]
                , _slackBots          :: [Bot]
                , _slackCacheVersion  :: Text
                } deriving Show

instance FromJSON SlackSession where
  parseJSON = withObject "SlackSession"
                (\o -> SlackSession <$>  o .: "self" <*> o .: "team"
                        <*> o .: "users"
                        <*> o .: "latest_event_ts" <*> o .: "channels"
                        <*> o .: "groups" <*> o .: "ims"
                        <*> o .: "bots" <*> o .: "cache_version")

makeLenses ''SlackSession