defmodule Web3SuiEx.Starcoin.Helpers do
  @moduledoc """
  Common helpers.
  """
  def sha3_256(bytes), do: :crypto.hash(:sha3_256, bytes)
  def normalize_bytes(input, size) do
    cond do
      is_binary(input) ->
        input_size = byte_size(input)
        cond do
          input_size == size ->
            {:ok, input}
          input_size == size * 2 ->
            from_hex(input)
          input_size == size * 2 + 2 ->
            from_hex(input)
          true ->
            {:error, :bad_format}
        end
      is_integer(input) ->
        cond do
          input < 0 ->
            {:error, :negtive_integer}
          input >= Bitwise.bsl(1, size * 8) ->
            {:error, :integer_too_big}
          true ->
            bits = size * 8
            {:ok, <<input::size(bits)>>}
        end
      true ->
        {:error, :bad_type}
    end
  end
  def from_hex("0x" <> bytes), do: from_hex(bytes)
  def from_hex(bytes), do: Base.decode16(bytes, case: :mixed)
  def to_hex(bytes, format \\ nil) do
    case format do
      :bare ->
        Base.encode16(bytes, case: :lower)
      :address ->
        "0x" <> String.trim_leading(Base.encode16(bytes, case: :lower), "0")
      _ ->
        "0x" <> Base.encode16(bytes, case: :lower)
    end
  end
  def normalize_address(address), do: normalize_bytes(address, 16)
  def normalize_key(key), do: normalize_bytes(key, 32)
end