module Rattletrap.Replay where

import Rattletrap.Content
import Rattletrap.Crc
import Rattletrap.Header
import Rattletrap.Word32

import qualified Data.Binary as Binary
import qualified Data.Binary.Put as Binary
import qualified Data.ByteString.Lazy as ByteString

data Replay = Replay
  { replayHeader :: Header
  , replayContent :: Content
  } deriving (Eq, Ord, Show)

getReplay :: Binary.Get Replay
getReplay = do
  _headerSize <- getWord32
  _headerCrc <- getWord32
  header <- getHeader
  _contentSize <- getWord32
  _contentCrc <- getWord32
  let version = getVersion header
  let numFrames = getNumFrames header
  content <- getContent version numFrames
  pure Replay {replayHeader = header, replayContent = content}

putReplay :: Replay -> Binary.Put
putReplay replay = do
  let header = Binary.runPut (putHeader (replayHeader replay))
  let headerSize = ByteString.length header
  let headerCrc = getCrc32 header
  putWord32 (Word32 (fromIntegral headerSize))
  putWord32 (Word32 headerCrc)
  Binary.putLazyByteString header
  let content = Binary.runPut (putContent (replayContent replay))
  let contentSize = ByteString.length content
  let contentCrc = getCrc32 content
  putWord32 (Word32 (fromIntegral contentSize))
  putWord32 (Word32 contentCrc)
  Binary.putLazyByteString content