{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Provides actions for Scheduled Event API
module Discord.Internal.Rest.ScheduledEvents
    ( ScheduledEventRequest(..)
    ) where
import           Data.Aeson                     ( ToJSON(toJSON) )
import           Discord.Internal.Rest.Prelude  ( JsonRequest(..)
                                                , Request
                                                    ( jsonRequest
                                                    , majorRoute
                                                    )
                                                , baseUrl
                                                )
import           Discord.Internal.Types.Prelude ( GuildId
                                                , ScheduledEventId
                                                )
import           Discord.Internal.Types.ScheduledEvents
                                                ( CreateScheduledEventData
                                                , ModifyScheduledEventData
                                                , ScheduledEvent
                                                , ScheduledEventUser
                                                )
import qualified Network.HTTP.Req              as R
import           Network.HTTP.Req               ( (/:), (/~) )

-- | Data constructor for requests.
-- See <https://discord.com/developers/docs/resources/guild-scheduled-event>
data ScheduledEventRequest a where
  -- | Gets all the Scheduled Events of a Guild
  ListScheduledEvents    ::GuildId
                         -> ScheduledEventRequest [ScheduledEvent]
  -- | Creates a new ScheduledEvent
  CreateScheduledEvent   ::GuildId
                         -> CreateScheduledEventData
                         -> ScheduledEventRequest ScheduledEvent
  -- | Gets the information about an Event
  GetScheduledEvent      ::GuildId
                         -> ScheduledEventId
                         -> ScheduledEventRequest ScheduledEvent
  -- | Modifies a Scheduled Event's information
  ModifyScheduledEvent   ::GuildId
                         -> ScheduledEventId
                         -> ModifyScheduledEventData
                         -> ScheduledEventRequest ScheduledEvent
  -- | Delete a ScheduledEvent
  DeleteScheduledEvent   ::GuildId
                         -> ScheduledEventId
                         -> ScheduledEventRequest ()
  -- | Gets the Users that subscribed to the event
  GetScheduledEventUsers ::GuildId
                         -> ScheduledEventId
                         -> ScheduledEventRequest [ScheduledEventUser]

sevEndpoint :: GuildId -> R.Url 'R.Https
sevEndpoint :: GuildId -> Url 'Https
sevEndpoint GuildId
gid = Url 'Https
baseUrl forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"guilds" forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
gid forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"scheduled-events"

instance Request (ScheduledEventRequest a) where
    majorRoute :: ScheduledEventRequest a -> String
majorRoute = forall a b. a -> b -> a
const String
"scheduledEvent"
    jsonRequest :: ScheduledEventRequest a -> JsonRequest
jsonRequest ScheduledEventRequest a
rq = case ScheduledEventRequest a
rq of
        ListScheduledEvents GuildId
gid  -> Url 'Https -> Option 'Https -> JsonRequest
Get (GuildId -> Url 'Https
sevEndpoint GuildId
gid) forall a. Monoid a => a
mempty
        GetScheduledEvent GuildId
gid ScheduledEventId
ev -> Url 'Https -> Option 'Https -> JsonRequest
Get (GuildId -> Url 'Https
sevEndpoint GuildId
gid forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ ScheduledEventId
ev) forall a. Monoid a => a
mempty
        CreateScheduledEvent GuildId
gid CreateScheduledEventData
ev ->
            forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Post (GuildId -> Url 'Https
sevEndpoint GuildId
gid) (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a. a -> ReqBodyJson a
R.ReqBodyJson forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => a -> Value
toJSON CreateScheduledEventData
ev) forall a. Monoid a => a
mempty
        ModifyScheduledEvent GuildId
gid ScheduledEventId
evi ModifyScheduledEventData
ev -> forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Patch
            (GuildId -> Url 'Https
sevEndpoint GuildId
gid forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ ScheduledEventId
evi)
            (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall a. a -> ReqBodyJson a
R.ReqBodyJson forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => a -> Value
toJSON ModifyScheduledEventData
ev)
            forall a. Monoid a => a
mempty
        DeleteScheduledEvent GuildId
gid ScheduledEventId
evi -> Url 'Https -> Option 'Https -> JsonRequest
Delete (GuildId -> Url 'Https
sevEndpoint GuildId
gid forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ ScheduledEventId
evi) forall a. Monoid a => a
mempty
        GetScheduledEventUsers GuildId
gid ScheduledEventId
evi ->
            Url 'Https -> Option 'Https -> JsonRequest
Get (GuildId -> Url 'Https
sevEndpoint GuildId
gid forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ ScheduledEventId
evi forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"users") forall a. Monoid a => a
mempty