{-# 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 Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"guilds" Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
gid Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"scheduled-events"

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