{-# LANGUAGE DataKinds, KindSignatures, TemplateHaskell #-}
module Web.Slack.Types.Id
  ( UserId,
    BotId,
    ChannelId,
    FileId,
    CommentId,
    GroupId,
    IMId,
    TeamId,
    Id,
    getId
  ) where

import Data.Aeson
import Data.Text (Text)
import Control.Lens.TH

data FieldType = TUser | TBot | TChannel | TFile | TComment | TGroup | TIM | TTeam deriving (Eq, Show)

newtype Id (a :: FieldType) = Id { _getId :: Text } deriving (Show, Eq)


instance ToJSON (Id a) where
  toJSON (Id uid) = String uid

instance FromJSON (Id a) where
  parseJSON = withText "Id" (return . Id)

type UserId    = Id TUser
type BotId     = Id TBot
type ChannelId = Id TChannel
type FileId    = Id TFile
type CommentId = Id TComment
type GroupId   = Id TGroup
type IMId      = Id TIM
type TeamId    = Id TTeam

makeLenses ''Id