-- | Invite endpoints
module Calamity.HTTP.Invite
    ( InviteRequest(..) ) where

import           Calamity.HTTP.Internal.Request
import           Calamity.HTTP.Internal.Route
import           Calamity.Types.Model.Guild

import           Control.Lens                   hiding ( (.=) )

import           Data.Text                      ( Text )

import           Network.Wreq.Lens
import           Network.Wreq.Session

import           TextShow

data InviteRequest a where
  GetInvite    :: Text -> InviteRequest Invite
  DeleteInvite :: Text -> InviteRequest ()

baseRoute :: RouteBuilder _
baseRoute :: RouteBuilder '[]
baseRoute = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "invites"

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

  route :: InviteRequest a -> Route
route (GetInvite c :: Text
c) = RouteBuilder '[]
baseRoute RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
c
    RouteBuilder '[] -> (RouteBuilder '[] -> Route) -> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[] -> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (DeleteInvite c :: Text
c) = RouteBuilder '[]
baseRoute RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
c
    RouteBuilder '[] -> (RouteBuilder '[] -> Route) -> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[] -> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute

  action :: InviteRequest a
-> Options -> Session -> String -> IO (Response ByteString)
action (GetInvite _) = (Options -> Options)
-> Options -> Session -> String -> IO (Response ByteString)
getWithP (Text -> Lens' Options [Text]
param "with_counts" (([Text] -> Identity [Text]) -> Options -> Identity Options)
-> [Text] -> Options -> Options
forall s t a b. ASetter s t a b -> b -> s -> t
.~ [Bool -> Text
forall a. TextShow a => a -> Text
showt Bool
True])
  action (DeleteInvite _) = Options -> Session -> String -> IO (Response ByteString)
deleteWith