{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoDeriveAnyClass #-}

-- | Guild permissions
module Calamity.Types.Model.Guild.Permissions (
  Permissions (..),
  createInstantInvite,
  kickMembers,
  banMembers,
  administrator,
  manageChannels,
  manageGuild,
  addReactions,
  viewAuditLog,
  prioritySpeaker,
  stream,
  viewChannel,
  sendMessages,
  sendTtsMessages,
  manageMessages,
  embedLinks,
  attachFiles,
  readMessageHistory,
  mentionEveryone,
  useExternalEmojis,
  viewGuildInsights,
  connect,
  speak,
  muteMembers,
  deafenMembers,
  moveMembers,
  useVad,
  changeNickname,
  manageNicknames,
  manageRoles,
  manageWebhooks,
  manageEmojis,
) where

import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Aeson.Types (parseFail)
import Data.Bits (Bits (shiftL))
import Data.Flags ()
import Data.Flags.TH
import Data.Text.Read (decimal)
import Data.Word
import TextShow

$( bitmaskWrapper
    "Permissions"
    ''Word64
    []
    [ ("createInstantInvite", 1 `shiftL` 0)
    , ("kickMembers", 1 `shiftL` 1)
    , ("banMembers", 1 `shiftL` 2)
    , ("administrator", 1 `shiftL` 3)
    , ("manageChannels", 1 `shiftL` 4)
    , ("manageGuild", 1 `shiftL` 5)
    , ("addReactions", 1 `shiftL` 6)
    , ("viewAuditLog", 1 `shiftL` 7)
    , ("prioritySpeaker", 1 `shiftL` 8)
    , ("stream", 1 `shiftL` 9)
    , ("viewChannel", 1 `shiftL` 10)
    , ("sendMessages", 1 `shiftL` 11)
    , ("sendTtsMessages", 1 `shiftL` 12)
    , ("manageMessages", 1 `shiftL` 13)
    , ("embedLinks", 1 `shiftL` 14)
    , ("attachFiles", 1 `shiftL` 15)
    , ("readMessageHistory", 1 `shiftL` 16)
    , ("mentionEveryone", 1 `shiftL` 17)
    , ("useExternalEmojis", 1 `shiftL` 18)
    , ("viewGuildInsights", 1 `shiftL` 19)
    , ("connect", 1 `shiftL` 20)
    , ("speak", 1 `shiftL` 21)
    , ("muteMembers", 1 `shiftL` 22)
    , ("deafenMembers", 1 `shiftL` 23)
    , ("moveMembers", 1 `shiftL` 24)
    , ("useVad", 1 `shiftL` 25)
    , ("changeNickname", 1 `shiftL` 26)
    , ("manageNicknames", 1 `shiftL` 27)
    , ("manageRoles", 1 `shiftL` 28)
    , ("manageWebhooks", 1 `shiftL` 29)
    , ("manageEmojis", 1 `shiftL` 30)
    , ("useApplicationCommands", 1 `shiftL` 31)
    , ("requestToSPeak", 1 `shiftL` 32)
    , ("manageEvents", 1 `shiftL` 33)
    , ("manageThreads", 1 `shiftL` 34)
    , ("createPublicThreads", 1 `shiftL` 35)
    , ("createPrivateThreads", 1 `shiftL` 36)
    , ("useExternalStickers", 1 `shiftL` 37)
    , ("sendMessagesInThreads", 1 `shiftL` 38)
    , ("useEmbeddedActivities", 1 `shiftL` 39)
    , ("moderateMembers", 1 `shiftL` 40)
    ]
 )

instance ToJSON Permissions where
  toJSON :: Permissions -> Value
toJSON = forall a. ToJSON a => a -> Value
toJSON forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TextShow a => a -> Text
showt
  toEncoding :: Permissions -> Encoding
toEncoding = forall a. ToJSON a => a -> Encoding
toEncoding forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TextShow a => a -> Text
showt

instance FromJSON Permissions where
  parseJSON :: Value -> Parser Permissions
parseJSON Value
a = do
    Text
asText <- forall a. FromJSON a => Value -> Parser a
parseJSON Value
a
    case forall a. Integral a => Reader a
decimal Text
asText of
      Right (Word64
n, Text
_) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Word64 -> Permissions
Permissions Word64
n
      Left String
e -> forall a. String -> Parser a
parseFail String
e

deriving via FromStringShow Permissions instance TextShow Permissions
deriving via Word64 instance NFData Permissions