-- | Guild Members
module Calamity.Types.Model.Guild.Member
    ( Member(..) ) where

import           Calamity.Internal.AesonThings
import           Calamity.Internal.Utils          ()
import {-# SOURCE #-} Calamity.Types.Model.Guild.Guild
import           Calamity.Types.Model.Guild.Role
import           Calamity.Types.Model.User
import           Calamity.Types.Snowflake

import           Control.Lens

import           Data.Aeson
import           Data.Generics.Product.Fields
import           Data.Text.Lazy                   ( Text )
import           Data.Time
import           Data.Vector.Unboxed              ( Vector )

import           GHC.Generics

import           TextShow
import qualified TextShow.Generic                 as TSG

data Member = Member
  { user     :: User
  , guildID  :: Snowflake Guild
  , nick     :: Maybe Text
  , roles    :: Vector (Snowflake Role)
  , joinedAt :: UTCTime
  , deaf     :: Bool
  , mute     :: Bool
  }
  deriving ( Eq, Show, Generic )
  deriving ( TextShow ) via TSG.FromGeneric Member
  deriving ( ToJSON, FromJSON ) via CalamityJSON Member
  deriving ( HasID Guild ) via HasIDField "guildID" Member

instance HasID User Member where
  getID = getID . (^. field @"user")

instance HasID Member Member where
  getID = coerceSnowflake . getID @User