{-# 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.Stream (SubEvent)

type ClientID = UUID

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

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

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

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