-- | Emoji endpoints
module Calamity.HTTP.Emoji
    ( EmojiRequest(..)
    , CreateGuildEmojiOptions(..)
    , ModifyGuildEmojiOptions(..) ) where

import           Calamity.HTTP.Internal.Request
import           Calamity.HTTP.Internal.Route
import           Calamity.Internal.AesonThings
import           Calamity.Internal.Utils        ()
import           Calamity.Types.Model.Guild
import           Calamity.Types.Snowflake

import           Data.Aeson
import           Data.Function
import           Data.Text                      ( Text )

import           GHC.Generics

import           Network.Wreq


data CreateGuildEmojiOptions = CreateGuildEmojiOptions
  { CreateGuildEmojiOptions -> Text
name  :: Text
  , CreateGuildEmojiOptions -> Text
image :: Text
  , CreateGuildEmojiOptions -> [Snowflake Role]
roles :: [Snowflake Role]
  }
  deriving ( Int -> CreateGuildEmojiOptions -> ShowS
[CreateGuildEmojiOptions] -> ShowS
CreateGuildEmojiOptions -> String
(Int -> CreateGuildEmojiOptions -> ShowS)
-> (CreateGuildEmojiOptions -> String)
-> ([CreateGuildEmojiOptions] -> ShowS)
-> Show CreateGuildEmojiOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateGuildEmojiOptions] -> ShowS
$cshowList :: [CreateGuildEmojiOptions] -> ShowS
show :: CreateGuildEmojiOptions -> String
$cshow :: CreateGuildEmojiOptions -> String
showsPrec :: Int -> CreateGuildEmojiOptions -> ShowS
$cshowsPrec :: Int -> CreateGuildEmojiOptions -> ShowS
Show, (forall x.
 CreateGuildEmojiOptions -> Rep CreateGuildEmojiOptions x)
-> (forall x.
    Rep CreateGuildEmojiOptions x -> CreateGuildEmojiOptions)
-> Generic CreateGuildEmojiOptions
forall x. Rep CreateGuildEmojiOptions x -> CreateGuildEmojiOptions
forall x. CreateGuildEmojiOptions -> Rep CreateGuildEmojiOptions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateGuildEmojiOptions x -> CreateGuildEmojiOptions
$cfrom :: forall x. CreateGuildEmojiOptions -> Rep CreateGuildEmojiOptions x
Generic )
  deriving ( [CreateGuildEmojiOptions] -> Encoding
[CreateGuildEmojiOptions] -> Value
CreateGuildEmojiOptions -> Encoding
CreateGuildEmojiOptions -> Value
(CreateGuildEmojiOptions -> Value)
-> (CreateGuildEmojiOptions -> Encoding)
-> ([CreateGuildEmojiOptions] -> Value)
-> ([CreateGuildEmojiOptions] -> Encoding)
-> ToJSON CreateGuildEmojiOptions
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CreateGuildEmojiOptions] -> Encoding
$ctoEncodingList :: [CreateGuildEmojiOptions] -> Encoding
toJSONList :: [CreateGuildEmojiOptions] -> Value
$ctoJSONList :: [CreateGuildEmojiOptions] -> Value
toEncoding :: CreateGuildEmojiOptions -> Encoding
$ctoEncoding :: CreateGuildEmojiOptions -> Encoding
toJSON :: CreateGuildEmojiOptions -> Value
$ctoJSON :: CreateGuildEmojiOptions -> Value
ToJSON ) via CalamityJSON CreateGuildEmojiOptions

data ModifyGuildEmojiOptions = ModifyGuildEmojiOptions
  { ModifyGuildEmojiOptions -> Text
name  :: Text
  , ModifyGuildEmojiOptions -> [Snowflake Role]
roles :: [Snowflake Role]
  }
  deriving ( Int -> ModifyGuildEmojiOptions -> ShowS
[ModifyGuildEmojiOptions] -> ShowS
ModifyGuildEmojiOptions -> String
(Int -> ModifyGuildEmojiOptions -> ShowS)
-> (ModifyGuildEmojiOptions -> String)
-> ([ModifyGuildEmojiOptions] -> ShowS)
-> Show ModifyGuildEmojiOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildEmojiOptions] -> ShowS
$cshowList :: [ModifyGuildEmojiOptions] -> ShowS
show :: ModifyGuildEmojiOptions -> String
$cshow :: ModifyGuildEmojiOptions -> String
showsPrec :: Int -> ModifyGuildEmojiOptions -> ShowS
$cshowsPrec :: Int -> ModifyGuildEmojiOptions -> ShowS
Show, (forall x.
 ModifyGuildEmojiOptions -> Rep ModifyGuildEmojiOptions x)
-> (forall x.
    Rep ModifyGuildEmojiOptions x -> ModifyGuildEmojiOptions)
-> Generic ModifyGuildEmojiOptions
forall x. Rep ModifyGuildEmojiOptions x -> ModifyGuildEmojiOptions
forall x. ModifyGuildEmojiOptions -> Rep ModifyGuildEmojiOptions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ModifyGuildEmojiOptions x -> ModifyGuildEmojiOptions
$cfrom :: forall x. ModifyGuildEmojiOptions -> Rep ModifyGuildEmojiOptions x
Generic )
  deriving ( [ModifyGuildEmojiOptions] -> Encoding
[ModifyGuildEmojiOptions] -> Value
ModifyGuildEmojiOptions -> Encoding
ModifyGuildEmojiOptions -> Value
(ModifyGuildEmojiOptions -> Value)
-> (ModifyGuildEmojiOptions -> Encoding)
-> ([ModifyGuildEmojiOptions] -> Value)
-> ([ModifyGuildEmojiOptions] -> Encoding)
-> ToJSON ModifyGuildEmojiOptions
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyGuildEmojiOptions] -> Encoding
$ctoEncodingList :: [ModifyGuildEmojiOptions] -> Encoding
toJSONList :: [ModifyGuildEmojiOptions] -> Value
$ctoJSONList :: [ModifyGuildEmojiOptions] -> Value
toEncoding :: ModifyGuildEmojiOptions -> Encoding
$ctoEncoding :: ModifyGuildEmojiOptions -> Encoding
toJSON :: ModifyGuildEmojiOptions -> Value
$ctoJSON :: ModifyGuildEmojiOptions -> Value
ToJSON ) via CalamityJSON ModifyGuildEmojiOptions

data EmojiRequest a where
  ListGuildEmojis  :: (HasID Guild g) =>                g ->                                 EmojiRequest [Emoji]
  GetGuildEmoji    :: (HasID Guild g, HasID Emoji e) => g -> e ->                            EmojiRequest Emoji
  CreateGuildEmoji :: (HasID Guild g) =>                g -> CreateGuildEmojiOptions ->      EmojiRequest Emoji
  ModifyGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> ModifyGuildEmojiOptions -> EmojiRequest Emoji
  DeleteGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e ->                            EmojiRequest ()

baseRoute :: Snowflake Guild -> RouteBuilder _
baseRoute :: Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute id :: Snowflake Guild
id = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "guilds" RouteBuilder '[] -> ID Guild -> ConsRes (ID Guild) '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Guild
forall k (a :: k). ID a
ID @Guild RouteBuilder '[ '(Guild, 'Required)]
-> S -> ConsRes S '[ '(Guild, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "emojis" RouteBuilder '[ '(Guild, 'Required)]
-> (RouteBuilder '[ '(Guild, 'Required)]
    -> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)])
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Required)]
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Guild
id

instance Request (EmojiRequest a) where
  type Result (EmojiRequest a) = a

  route :: EmojiRequest a -> Route
route (ListGuildEmojis (g -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) = Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute Snowflake Guild
gid RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)] -> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (GetGuildEmoji (g -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall a. HasID Emoji a => a -> Snowflake Emoji
forall b a. HasID b a => a -> Snowflake b
getID @Emoji -> Snowflake Emoji
eid)) = Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute Snowflake Guild
gid RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> ID Emoji
-> ConsRes (ID Emoji) '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Emoji
forall k (a :: k). ID a
ID @Emoji
    RouteBuilder
  '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> RouteBuilder
         '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
            '(Guild, 'Required)])
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Emoji
-> RouteBuilder
     '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Emoji
eid
    RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
         '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (CreateGuildEmoji (g -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) _) = Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute Snowflake Guild
gid RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)] -> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (ModifyGuildEmoji (g -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall a. HasID Emoji a => a -> Snowflake Emoji
forall b a. HasID b a => a -> Snowflake b
getID @Emoji -> Snowflake Emoji
eid) _) = Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute Snowflake Guild
gid RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> ID Emoji
-> ConsRes (ID Emoji) '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Emoji
forall k (a :: k). ID a
ID @Emoji
    RouteBuilder
  '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> RouteBuilder
         '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
            '(Guild, 'Required)])
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Emoji
-> RouteBuilder
     '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Emoji
eid
    RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
         '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (DeleteGuildEmoji (g -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall a. HasID Emoji a => a -> Snowflake Emoji
forall b a. HasID b a => a -> Snowflake b
getID @Emoji -> Snowflake Emoji
eid)) = Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
baseRoute Snowflake Guild
gid RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> ID Emoji
-> ConsRes (ID Emoji) '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Emoji
forall k (a :: k). ID a
ID @Emoji
    RouteBuilder
  '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> RouteBuilder
         '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
            '(Guild, 'Required)])
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Emoji
-> RouteBuilder
     '[ '(Emoji, 'Required), '(Guild, 'Satisfied), '(Guild, 'Required)]
-> RouteBuilder
     '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
        '(Guild, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Emoji
eid
    RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> (RouteBuilder
      '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
         '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder
  '[ '(Emoji, 'Satisfied), '(Emoji, 'Required), '(Guild, 'Satisfied),
     '(Guild, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute

  action :: EmojiRequest a -> Options -> String -> IO (Response ByteString)
action (ListGuildEmojis _)       = Options -> String -> IO (Response ByteString)
getWith
  action (GetGuildEmoji _ _)       = Options -> String -> IO (Response ByteString)
getWith
  action (CreateGuildEmoji _ o :: CreateGuildEmojiOptions
o)    = Value -> Options -> String -> IO (Response ByteString)
forall a.
Postable a =>
a -> Options -> String -> IO (Response ByteString)
postWith' (CreateGuildEmojiOptions -> Value
forall a. ToJSON a => a -> Value
toJSON CreateGuildEmojiOptions
o)
  action (ModifyGuildEmoji _ _ o :: ModifyGuildEmojiOptions
o)  = Value -> Options -> String -> IO (Response ByteString)
forall a.
Patchable a =>
a -> Options -> String -> IO (Response ByteString)
patchWith' (ModifyGuildEmojiOptions -> Value
forall a. ToJSON a => a -> Value
toJSON ModifyGuildEmojiOptions
o)
  action (DeleteGuildEmoji _ _)    = Options -> String -> IO (Response ByteString)
deleteWith