module Rattletrap.Header where

import Rattletrap.Primitive
import Rattletrap.Property
import Rattletrap.PropertyValue

import qualified Data.Binary as Binary

data Header = Header
  { headerEngineVersion :: Word32
  , headerLicenseeVersion :: Word32
  , headerLabel :: Text
  , headerProperties :: Dictionary Property
  } deriving (Eq, Ord, Show)

getHeader :: Binary.Get Header
getHeader = do
  engineVersion <- getWord32
  licenseeVersion <- getWord32
  label <- getText
  properties <- getDictionary getProperty
  pure (Header engineVersion licenseeVersion label properties)

putHeader :: Header -> Binary.Put
putHeader header = do
  putWord32 (headerEngineVersion header)
  putWord32 (headerLicenseeVersion header)
  putText (headerLabel header)
  putDictionary putProperty (headerProperties header)

getVersion
  :: (Integral a, Integral b)
  => Header -> (a, b)
getVersion header =
  let major = getMajorVersion header
      minor = getMinorVersion header
  in (major, minor)

getMajorVersion
  :: (Integral a)
  => Header -> a
getMajorVersion header = fromIntegral (word32Value (headerEngineVersion header))

getMinorVersion
  :: (Integral a)
  => Header -> a
getMinorVersion header =
  fromIntegral (word32Value (headerLicenseeVersion header))

getNumFrames
  :: (Integral a)
  => Header -> a
getNumFrames header =
  let key = stringToText "NumFrames"
      properties = dictionaryValue (headerProperties header)
  in case lookup key properties of
       Just (Just (Property _ _ (IntProperty numFrames))) ->
         fromIntegral (int32Value numFrames)
       _ -> 0