{-# LANGUAGE NamedFieldPuns #-}

module Data.Morpheus.Types.Internal.WebSocket
  ( GQLClient(..)
  , ClientID
  , ClientSession(..)
  )
where

import           Data.Semigroup                 ( (<>) )
import           Data.Text                      ( Text )
import           Data.UUID                      ( UUID )
import           Network.WebSockets             ( Connection )

-- MORPHEUS
import           Data.Morpheus.Types.Internal.Resolving
                                                ( SubEvent )

type ClientID = UUID

data ClientSession m e =
  ClientSession
    { sessionId           :: Text
    , sessionSubscription :: SubEvent m e
    }

instance (Show e) => Show (ClientSession m e ) where
  show ClientSession { sessionId } =
    "GQLSession { id: " <> show sessionId <> ", sessions: " <> "" <> " }"

data GQLClient m e  =
  GQLClient
    { clientID         :: ClientID
    , clientConnection :: Connection
    , clientSessions   :: [ClientSession m e ]
    }

instance (Show e) => Show (GQLClient m e) where
  show GQLClient { clientID, clientSessions } =
    "GQLClient {id:"
      <> show clientID
      <> ", sessions:"
      <> show clientSessions
      <> "}"