module Rattletrap.AttributeValue.PartyLeader where

import Rattletrap.RemoteId
import Rattletrap.Word8

import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit

data PartyLeaderAttributeValue = PartyLeaderAttributeValue
  { partyLeaderAttributeValueSystemId :: Word8
  , partyLeaderAttributeValueId :: Maybe (RemoteId, Word8)
  } deriving (Eq, Ord, Show)

getPartyLeaderAttributeValue :: BinaryBit.BitGet PartyLeaderAttributeValue
getPartyLeaderAttributeValue = do
  systemId <- getWord8Bits
  maybeRemoteAndLocalId <-
    if systemId == Word8 0
      then pure Nothing
      else do
        remoteId <- getRemoteId systemId
        localId <- getWord8Bits
        pure (Just (remoteId, localId))
  pure (PartyLeaderAttributeValue systemId maybeRemoteAndLocalId)

putPartyLeaderAttributeValue :: PartyLeaderAttributeValue -> BinaryBit.BitPut ()
putPartyLeaderAttributeValue partyLeaderAttributeValue = do
  putWord8Bits (partyLeaderAttributeValueSystemId partyLeaderAttributeValue)
  case partyLeaderAttributeValueId partyLeaderAttributeValue of
    Nothing -> pure ()
    Just (remoteId, localId) -> do
      putRemoteId remoteId
      putWord8Bits localId