lib/Arpas/REST/Esri/query.ex

defmodule Arpas.REST.Esri.Query do
  alias Arpas.REST.Esri.Permesso
  alias Cape.Utilita, as: Ut
  alias Cape.Generico, as: Gen

  def take_x_features, do: MapSet.new([:token, :sortby, :where, :outfields, :f])

  def take_x_info, do: MapSet.new([:token, :f])

  def tipo, do: MapSet.new([:feature_info, :feature_table])

  defstruct [
    :url,
    :token,
    :info_token,
    :sortby,
    where: "1=1",
    outfields: "*",
    f: "json",
    feature: "",
    user: :no_token,
    tipo: :feature_info
  ]

  def make_url(:feature_info, esri_query) do
    take = take_x_info()
    make_url(esri_query, take)
  end

  def make_url(:feature_table, esri_query) do
    take = take_x_features()
    make_url(esri_query, take)
  end

  def make_url(esri_query, take_what) do
    numero = esri_query.feature

    esri_map =
      esri_query
      |> Ut.struct2map_no_nil()
      |> Ut.filtra_solo(take_what)

    add_feature_num =
      case numero do
        "" ->
          ""

        altro ->
          altro <> "/" <> "query"
      end

    my_uri = URI.parse(esri_query.url <> add_feature_num)

    URI.append_query(my_uri, URI.encode_query(esri_map))
    |> URI.to_string()
  end

  def encode_query(esri_query) do
    Ut.encode_query(esri_query)
  end

  def merge_token(esri_query, tk) do
    token = Map.get(tk, "access_token")
    esri_query = %{esri_query | token: token}
    esri_query
  end

  def add_token(esri_query, user \\ :no_token) do
    case user do
      :no_token ->
        esri_query

      :alai ->
        merge_token(esri_query, Permesso.token(user))

      :idro ->
        merge_token(esri_query, Permesso.token(user))

      _user ->
        esri_query
    end
  end

  def url_test do
    {:ok, contenuto} = File.read(Path.expand("secret_esri_feature.txt"))
    contenuto
  end

  def dammi(query) do
    tipo = query.tipo

    new_query =
      case query.user do
        :no_token ->
          query

        user ->
          query
          |> add_token(user)
      end

    url = make_url(tipo, new_query)
    {:ok, dato} = Gen.get(url)
    dato
  end

  def info, do: dammi(%Arpas.REST.Esri.Query{url: url_test(), tipo: :feature_info})

  def tab1, do: dammi(%Arpas.REST.Esri.Query{url: url_test(), tipo: :feature_table, feature: "0"})
end