lib/ex_weatherkit.ex

defmodule ExWeatherkit do
  @moduledoc """
  ExWeatherkit is an Apple WeatherKit REST API client for Elixir
  """

  @doc """
  Get current weather for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts

  ## Example:
      iex> ExWeatherkit.current_weather(39.183608, -96.571669)
  """
  def current_weather(lat, lng, lang \\ "en", tz \\ "GMT/UTC") do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=currentWeather"
    |> ExWeatherkit.API.fetch()
  end

  @doc """
  Get daily forecast for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts

  ## Example:
      iex> ExWeatherkit.forecast_daily(39.183608, -96.571669)
  """
  def forecast_daily(lat, lng, lang \\ "en", tz \\ "GMT/UTC") do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=forecastDaily"
    |> ExWeatherkit.API.fetch()
  end

  @doc """
  Get hourly forecast for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts

  ## Example:
      iex> ExWeatherkit.forecast_hourly(39.183608, -96.571669)
  """
  def forecast_hourly(lat, lng, lang \\ "en", tz \\ "GMT/UTC") do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=forecastHourly"
    |> ExWeatherkit.API.fetch()
  end

  @doc """
  Get next hour forecast for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts

  ## Example:
      iex> ExWeatherkit.forecast_next_hour(39.183608, -96.571669)
  """
  def forecast_next_hour(lat, lng, lang \\ "en", tz \\ "GMT/UTC") do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=forecastNextHour"
    |> ExWeatherkit.API.fetch()
  end

  @doc """
  Get weather alerts for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts
    - country_code: The ISO Alpha-2 country code for the requested location

  ## Example:
      iex> ExWeatherkit.weather_alerts(39.183608, -96.571669)
  """
  def weather_alerts(lat, lng, lang \\ "en", tz \\ "GMT/UTC", country_code \\ "US") do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=weatherAlerts&countryCode=#{country_code}"
    |> ExWeatherkit.API.fetch()
  end

  @doc """
  Get multiple weather data sets for a latitude and longitude

  ## Parameters
    - lat: The latitude of the desired location
    - lng: The longitude of the desired location
    - lang: The language tag to use for localizing responses
    - tz: The name of the timezone to use for rolling up weather forecasts into daily forecasts
    - data_sets: A list of data sets to include in the response, possible values: currentWeather, forecastDaily, forecastHourly, forecastNextHour, weatherAlerts
    - country_code: The ISO Alpha-2 country code of the requested location

  ## Example:
      iex> ExWeatherkit.weather_multi(39.183608, -96.571669, ["currentWeather", "forecastDaily"])
  """
  def weather_multi(
        lat,
        lng,
        data_sets \\ ["currentWeather"],
        lang \\ "en",
        tz \\ "GMT/UTC",
        country_code \\ "US"
      ) do
    "#{lang}/#{lat}/#{lng}?timezone=#{tz}&dataSets=#{Enum.join(data_sets, ",")}&countryCode=#{country_code}"
    |> ExWeatherkit.API.fetch()
  end
end