lib/Arpas/REST/Esri/Api.ex

defmodule Arpas.REST.Esri.Api do
  @moduledoc ~S'''
  Utilita per accedere ad AGOL(Arcgis online) tramite api rest
  '''

  alias Arpas.REST.Esri.Env
  alias Cape.Generico, as: Gen

  def users do
    [:no_token, :alai, :idro]
  end

  @doc """
  Restituisce token per accedere ad AGOL
  :idro
  :alai
  """
  def token(:idro), do: token(Env.id_idro(), Env.secret_idro())

  def token(:alai), do: token(Env.id(), Env.secret())

  def token(), do: token(:idro)

  def token(id, secret) do
    url = Env.token_url()
    expiration = "21600"

    payload =
      "client_id=#{id}&client_secret=#{secret}&grant_type=client_credentials&expiration=#{expiration}"

    case Gen.post(url, payload) do
      {:error, reason} ->
        IO.inspect(reason)
        {:error, reason}

      my_token ->
        IO.inspect(my_token, label: "my_token")
        adesso = DateTime.now!("Etc/UTC")
        finisce = my_token["expires_in"]
        IO.puts(finisce)
        scadenza = DateTime.add(adesso, finisce, :second)
        my_token = Map.put(my_token, "log_now", adesso)
        Map.put(my_token, "scade", scadenza)
    end
  end

  def get_access_token(log_as \\ :idro) do
    token(log_as)
    |> Map.get("access_token")
  end

  def add_token(log_as) do
    case log_as do
      :no_token ->
        ""

      _user ->
        user_token = get_access_token(log_as)
        "token=#{user_token}"
    end
  end

  def query_all(log_as \\ :no_token) do
    access = add_token(log_as)
    "/query?where=1=1&outfields=*&f=json&#{access}"
  end

  def query_feature_info(log_as \\ :no_token, url) do
    access = add_token(log_as)
    url = url <> "?f=json&#{access}"
    IO.inspect(url, label: "url")
    Gen.get(url)
  end

  def layers(log_as \\ :idro, url \\ Env.services()) do
    access = get_access_token(log_as)
    url = url <> "?token=#{access}&f=json"

    IO.inspect(url, label: "url")
    Gen.get(url)
  end

  def terzo do
    {:ok, res} = layers()
    servizi = Map.get(res, "services")
    tl(servizi) |> tl |> hd
  end
end