module Generators.Message
  ( genMessageId,
    genMessageType,
    genStreamPosition,
    genGlobalPosition,
    genPayload,
    genMetadata,
    genCreatedAtTimestamp,
    genMessage,
  )
where

import Generators (genAesonValue, genUTCTime, genUUID)
import Generators.StreamName (genStreamName)
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import MessageDb.Message (Message (Message))
import qualified MessageDb.Message as Message


genMessageId :: Gen Message.MessageId
genMessageId =
  fmap Message.MessageId genUUID


genMessageType :: Gen Message.MessageType
genMessageType =
  fmap Message.MessageType $
    let range = Range.linear 20 100
     in Gen.text range Gen.alphaNum


genStreamPosition :: Gen Message.StreamPosition
genStreamPosition =
  Message.StreamPosition <$> Gen.integral (Range.constant 0 1_000_000)


genGlobalPosition :: Gen Message.GlobalPosition
genGlobalPosition =
  Message.GlobalPosition <$> Gen.integral (Range.constant 0 1_000_000)


genPayload :: Gen Message.Payload
genPayload =
  fmap Message.Payload genAesonValue


genMetadata :: Gen Message.Metadata
genMetadata =
  fmap Message.Metadata genAesonValue


genCreatedAtTimestamp :: Gen Message.CreatedAt
genCreatedAtTimestamp =
  fmap Message.CreatedAt genUTCTime


genMessage :: Gen Message
genMessage = do
  messageId <- genMessageId
  messageStream <- genStreamName
  messageType <- genMessageType
  messageStreamPosition <- genStreamPosition
  messageGlobalPosition <- genGlobalPosition
  messagePayload <- genPayload
  messageMetadata <- genMetadata
  messageCreatedAt <- genCreatedAtTimestamp

  pure Message{..}