lib/walkscore_ex.ex

defmodule WalkscoreEx do
  @moduledoc """
  This is an Elixir client for the [WalkScore API](https://www.walkscore.com/professional/api.php).

  Make sure you add `walkscore_ex` to your mix.exs and then run `mix deps.get`.
  ```elixir
    def deps do
      [
        {:walkscore_ex, "~> 0.0.1"}
      ]
    end
  ```

  In order to use WalkscoreEx, you must register and receive an API key from WalkScore
  and save that value in your config, eg:

  ```elixir
  config :walkscore_ex, walkscore_api_key: "YOUR_API_KEY_FROM_WALKSCORE"
  ```
  """

  @base_walkscore_api_url "https://api.walkscore.com/score?format=json"
  @walk_api_key Application.get_env(:walkscore_ex, :walkscore_api_key)

  @doc """
  This method accepts the string parameters latitude, longitude, and address.
  It makes an API call to the WalkScore API and returns a decoded JSON response.

  ## Examples
  ```elixir
    # params
    latitude = "38.897675"
    longitude = "-77.036547"
    address = "1600 Pennsylvania Avenue NW, Washington, DC, USA"

    # API call
    response = WalkscoreEx.get_score(latitude, longitude, address)

    # value of `response`
    %{
      "description" => "Very Walkable",
      "help_link" => "https://www.redfin.com/how-walk-score-works",
      "logo_url" => "https://cdn.walk.sc/images/api-logo.png",
      "more_info_icon" => "https://cdn.walk.sc/images/api-more-info.gif",
      "more_info_link" => "https://www.redfin.com/how-walk-score-works",
      "snapped_lat" => 38.898,
      "snapped_lon" => -77.037,
      "status" => 1,
      "updated" => "2023-02-13 03:39:18.898986",
      "walkscore" => 83,
      "ws_link" => "https://www.walkscore.com/score/1600-Pennsylvania-Avenue-NW-Washington-DC-USA/lat=38.897675/lng=-77.036547"
    }
  ```
  """
  def get_score(latitude, longitude, address) do
    walkscore_url = format_url(latitude, longitude, address, @walk_api_key)
    HTTPoison.start()
    response = HTTPoison.get!(walkscore_url)
    Poison.decode!(response.body)
  end

  def format_url(lat, lon, address, api_key) do
    URI.encode(
      "#{@base_walkscore_api_url}&wsapikey=#{api_key}&address=#{address}&lat=#{lat}&lon=#{lon}"
    )
  end
end