{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}

module Octane.Type.Replication
  ( Replication(..)
  ) where

import qualified Data.Default.Class as Default
import qualified Data.Map.Strict as Map
import qualified Data.OverloadedRecords.TH as OverloadedRecords
import qualified Data.Text as StrictText
import qualified Octane.Type.CompressedWord as CompressedWord
import qualified Octane.Type.Initialization as Initialization
import qualified Octane.Type.State as State
import qualified Octane.Type.Value as Value

-- | A replicated actor in a frame.
--
-- This cannot be an instance of 'Data.Binary.Bits.BinaryBit' because it
-- requires out-of-band information (the class property map) to decode.
data Replication = Replication
  { replicationActorId :: CompressedWord.CompressedWord
    -- ^ The actor's ID.
  , replicationObjectName :: StrictText.Text
    -- ^ The name of the actor's object.
  , replicationClassName :: StrictText.Text
    -- ^ The name of the actor's class.
  , replicationState :: State.State
    -- ^ Which state this actor's replication is in.
  , replicationInitialization :: Maybe Initialization.Initialization
    -- ^ The optional initialization information for this actor. These only
    -- exist for new actors.
  , replicationProperties :: Map.Map StrictText.Text Value.Value
    -- ^ The property updates associated with this actor's replication.
  } deriving (Eq, Show)

$(OverloadedRecords.overloadedRecord Default.def ''Replication)