defmodule LastFm.API.Signature do
  @spec generate(map() | keyword(), String.t()) :: String.t()
  def generate(params, shared_secret) do
    encoded_params =
      params
      # Params needs to be ASCII ordered alphabetically
      |> Enum.sort()
      |> Enum.map_join(fn {key, value} ->
        "#{key}#{value}"
      end)

    :crypto.hash(:md5, encoded_params <> shared_secret) |> Base.encode16(case: :lower)
  end
end
