{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

----------------------------------------------------------------------
-- |
-- Module: Web.Slack.Chat
-- Description:
--
--
--
----------------------------------------------------------------------

module Web.Slack.Chat
  ( PostMsg(..)
  , PostMsgReq(..)
  , mkPostMsgReq
  , PostMsgRsp(..)
  )
  where

-- aeson
import Data.Aeson.TH

-- base
import GHC.Generics (Generic)

-- http-api-data
import Web.FormUrlEncoded

-- slack-web
import Web.Slack.Util

-- text
import Data.Text (Text)


data PostMsg =
  PostMsg
    { postMsgText :: Text
    , postMsgParse :: Maybe Text
    , postMsgLinkNames :: Maybe Bool
    , postMsgAttachments :: Maybe Text
    , postMsgUnfurlLinks :: Maybe Bool
    , postMsgUnfurlMedia :: Maybe Bool
    , postMsgUsername :: Maybe Text
    , postMsgAsUser :: Maybe Bool
    , postMsgIconUrl :: Maybe Text
    , postMsgIconEmoji :: Maybe Text
    , postMsgThreadTs :: Maybe Text
    , postMsgReplyBroadcast :: Maybe Bool
    }
  deriving (Eq, Generic, Show)


-- |
--
--

$(deriveJSON (jsonOpts "postMsg") ''PostMsg)


-- |
--
--

data PostMsgReq =
  PostMsgReq
    { postMsgReqChannel :: Text
    , postMsgReqText :: Text
    , postMsgReqParse :: Maybe Text
    , postMsgReqLinkNames :: Maybe Bool
    , postMsgReqAttachments :: Maybe Text
    , postMsgReqUnfurlLinks :: Maybe Bool
    , postMsgReqUnfurlMedia :: Maybe Bool
    , postMsgReqUsername :: Maybe Text
    , postMsgReqAsUser :: Maybe Bool
    , postMsgReqIconUrl :: Maybe Text
    , postMsgReqIconEmoji :: Maybe Text
    , postMsgReqThreadTs :: Maybe Text
    , postMsgReqReplyBroadcast :: Maybe Bool
    }
  deriving (Eq, Generic, Show)


-- |
--
--

$(deriveJSON (jsonOpts "postMsgReq") ''PostMsgReq)


-- |
--
--

instance ToForm PostMsgReq where
  toForm =
    genericToForm (formOpts "postMsgReq")


-- |
--
--

mkPostMsgReq
  :: Text
  -> Text
  -> PostMsgReq
mkPostMsgReq channel text =
  PostMsgReq
    { postMsgReqChannel = channel
    , postMsgReqText = text
    , postMsgReqParse = Nothing
    , postMsgReqLinkNames = Nothing
    , postMsgReqAttachments = Nothing
    , postMsgReqUnfurlLinks = Nothing
    , postMsgReqUnfurlMedia = Nothing
    , postMsgReqUsername = Nothing
    , postMsgReqAsUser = Nothing
    , postMsgReqIconUrl = Nothing
    , postMsgReqIconEmoji = Nothing
    , postMsgReqThreadTs = Nothing
    , postMsgReqReplyBroadcast = Nothing
    }


-- |
--
--

data PostMsgRsp =
  PostMsgRsp
    { postMsgRspTs :: String
    , postMsgRspMessage :: PostMsg
    }
  deriving (Eq, Generic, Show)

$(deriveFromJSON (jsonOpts "postMsgRsp") ''PostMsgRsp)