module Rattletrap.AttributeValue.Reservation where

import Rattletrap.AttributeValue.UniqueId
import Rattletrap.CompressedWord
import Rattletrap.Text
import Rattletrap.Word8

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

data ReservationAttributeValue = ReservationAttributeValue
  { reservationAttributeValueNumber :: CompressedWord
  , reservationAttributeValueUniqueId :: UniqueIdAttributeValue
  , reservationAttributeValueName :: Maybe Text
  , reservationAttributeValueUnknown1 :: Bool
  , reservationAttributeValueUnknown2 :: Bool
  , reservationAttributeValueUnknown3 :: Maybe Word.Word8
  } deriving (Eq, Ord, Show)

getReservationAttributeValue :: (Int, Int)
                             -> BinaryBit.BitGet ReservationAttributeValue
getReservationAttributeValue version = do
  number <- getCompressedWord 7
  uniqueId <- getUniqueIdAttributeValue
  name <-
    if uniqueIdAttributeValueSystemId uniqueId == Word8 0
      then pure Nothing
      else do
        name <- getTextBits
        pure (Just name)
  a <- BinaryBit.getBool
  b <- BinaryBit.getBool
  mc <-
    if version < (868, 12)
      then pure Nothing
      else do
        c <- BinaryBit.getWord8 6
        pure (Just c)
  pure (ReservationAttributeValue number uniqueId name a b mc)

putReservationAttributeValue :: ReservationAttributeValue -> BinaryBit.BitPut ()
putReservationAttributeValue reservationAttributeValue = do
  putCompressedWord (reservationAttributeValueNumber reservationAttributeValue)
  putUniqueIdAttributeValue
    (reservationAttributeValueUniqueId reservationAttributeValue)
  case reservationAttributeValueName reservationAttributeValue of
    Nothing -> pure ()
    Just name -> putTextBits name
  BinaryBit.putBool
    (reservationAttributeValueUnknown1 reservationAttributeValue)
  BinaryBit.putBool
    (reservationAttributeValueUnknown2 reservationAttributeValue)
  case reservationAttributeValueUnknown3 reservationAttributeValue of
    Nothing -> pure ()
    Just c -> BinaryBit.putWord8 6 c