///|
fn uint64_array_to_bytes(values : Array[UInt64]) -> Bytes {
  Bytes::makei(32, fn(i) {
    let value_index = i / 8
    let byte_index = i % 8
    let value = values[value_index]
    match byte_index {
      0 => value.to_byte()
      1 => (value >> 8).to_byte()
      2 => (value >> 16).to_byte()
      3 => (value >> 24).to_byte()
      4 => (value >> 32).to_byte()
      5 => (value >> 40).to_byte()
      6 => (value >> 48).to_byte()
      7 => (value >> 56).to_byte()
      _ => b'\x00'
    }
  })
}

///|
pub fn generate_normalized_seed(seed : UInt64) -> Bytes {
  let part1 = seed - 25
  let part2 = seed + 25
  let part3 = seed - 41
  let part4 = seed + 41
  uint64_array_to_bytes([part1, part2, part3, part4])
}

///|
pub fn generate_time_based_seed() -> Bytes {
  let timestamp = @env.now()
  generate_normalized_seed(timestamp)
}