-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module Hedgehog.Gen.Tezos.Crypto.Timelock
  ( genChestAndKey
  , genChestAndKeyWithParams
  , genTLTime
  ) where

import Hedgehog (MonadGen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range

import Morley.Tezos.Crypto.Timelock

genChestAndKey :: MonadGen m => m (Chest, ChestKey)
genChestAndKey :: forall (m :: * -> *). MonadGen m => m (Chest, ChestKey)
genChestAndKey = ((Chest, ChestKey), (ByteString, TLTime)) -> (Chest, ChestKey)
forall a b. (a, b) -> a
fst (((Chest, ChestKey), (ByteString, TLTime)) -> (Chest, ChestKey))
-> m ((Chest, ChestKey), (ByteString, TLTime))
-> m (Chest, ChestKey)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe TLTime -> m ((Chest, ChestKey), (ByteString, TLTime))
forall (m :: * -> *).
MonadGen m =>
Maybe TLTime -> m ((Chest, ChestKey), (ByteString, TLTime))
genChestAndKeyWithParams Maybe TLTime
forall a. Maybe a
Nothing

genTLTime :: MonadGen m => m TLTime
genTLTime :: forall (m :: * -> *). MonadGen m => m TLTime
genTLTime = Word16 -> TLTime
forall a. (Integral a, CheckIntSubType a Word62) => a -> TLTime
toTLTime (Word16 -> TLTime) -> m Word16 -> m TLTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Word16 -> m Word16
forall (m :: * -> *). MonadGen m => Range Word16 -> m Word16
Gen.word16 (Word16 -> Word16 -> Range Word16
forall a. Integral a => a -> a -> Range a
Range.linear Word16
1000 Word16
10000)

genChestAndKeyWithParams
  :: MonadGen m
  => Maybe TLTime
  -> m ((Chest, ChestKey), (ByteString, TLTime))
genChestAndKeyWithParams :: forall (m :: * -> *).
MonadGen m =>
Maybe TLTime -> m ((Chest, ChestKey), (ByteString, TLTime))
genChestAndKeyWithParams Maybe TLTime
mbtime = do
  Int
seed <- m Int
forall (m :: * -> *) a. (MonadGen m, Enum a, Bounded a) => m a
Gen.enumBounded
  ByteString
payload <- Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
Gen.bytes (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
1 Int
1024)
  TLTime
time <- m TLTime -> (TLTime -> m TLTime) -> Maybe TLTime -> m TLTime
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m TLTime
forall (m :: * -> *). MonadGen m => m TLTime
genTLTime TLTime -> m TLTime
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe TLTime
mbtime
  let (Chest
chest, ChestKey
key) = Int -> ByteString -> TLTime -> (Chest, ChestKey)
createChestAndChestKeyFromSeed Int
seed ByteString
payload TLTime
time
  ((Chest, ChestKey), (ByteString, TLTime))
-> m ((Chest, ChestKey), (ByteString, TLTime))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Chest
chest, ChestKey
key), (ByteString
payload, TLTime
time))