defmodule MobilizonWeb.Resolvers.Address do
  @moduledoc """
  Handles the comment-related GraphQL calls
  """
  require Logger
  alias Mobilizon.Addresses.Address
  alias Mobilizon.Service.Geospatial

  @doc """
  Search an address
  """
  @spec search(map(), map(), map()) :: {:ok, list(Address.t())}
  def search(_parent, %{query: query, locale: locale, page: _page, limit: _limit}, %{
        context: %{ip: ip}
      }) do
    geolix = Geolix.lookup(ip)

    country_code =
      case geolix do
        %{country: %{iso_code: country_code}} -> String.downcase(country_code)
        _ -> nil
      end

    addresses = Geospatial.service().search(query, lang: locale, country_code: country_code)

    {:ok, addresses}
  end

  @doc """
  Reverse geocode some coordinates
  """
  @spec reverse_geocode(map(), map(), map()) :: {:ok, list(Address.t())}
  def reverse_geocode(
        _parent,
        %{longitude: longitude, latitude: latitude, zoom: zoom, locale: locale},
        _context
      ) do
    addresses = Geospatial.service().geocode(longitude, latitude, lang: locale, zoom: zoom)

    {:ok, addresses}
  end
end