defmodule SecretHandshake do
  @doc """
  Determine the actions of a secret handshake based on the binary
  representation of the given `code`.

  If the following bits are set, include the corresponding action in your list
  of commands, in order from lowest to highest.

  1 1 = wink
  2 10 = double blink
  4 100 = close your eyes
  8 1000 = jump

  16 10000 = Reverse the order of the operations in the secret handshake
  """

  @coms %{
    1 => "wink",
    2 => "double blink",
    4 => "close your eyes",
    8 => "jump",
    16 => "reverse"
  }

  @spec commands(code :: integer) :: list(String.t())
  def commands(code) do
    @coms
    |> Map.keys()
    |> Enum.reduce([], &if(Bitwise.band(code, &1) == &1, do: [@coms[&1] | &2], else: &2))
    |> case do
      ["reverse" | tail] -> tail
      reversed_list -> Enum.reverse(reversed_list)
    end
  end
end