lib/interfaces/http.ex

defmodule SurrealEx.HTTP do

  alias SurrealEx.HTTPResponse
  alias SurrealEx.Response

  def sql(config, query) do
    url = "#{config.uri}/sql"
    headers = config._prepare.headers
    options = []

    HTTPoison.post(url, query, headers, options)
    |> HTTPResponse.build()
  end

  def get(config, table, id) do
    url = "#{config.uri}/key/#{table}/#{id}"
    headers = config._prepare.headers
    options = []

    HTTPoison.get(url, headers, options)
    |> HTTPResponse.build()
    |> response_to_dot()
    |> response_get()
  end

  defp response_get({:ok, [response]}) do
    cond do
      response.status == "OK" && response.result == [] ->
        {:not_found, nil}
      response.status == "ERR" ->
        {:error, response.detail}
      true ->
        item = response.result
        {:found, item}
    end
  end
  defp response_get(err), do: err

  def create(config, table, body) do
    url = "#{config.uri}/key/#{table}"
    headers = config._prepare.headers
    options = []

    HTTPoison.post(url, body, headers, options)
    |> HTTPResponse.build()
    |> response_to_dot()
    |> response_create()
  end

  defp response_create({:ok, [response]}) do
    cond do
      response.status == "ERR" ->
        {:error, response.detail}
      true ->
        id = response.result[:id]
        {:create, id}
    end
  end
  defp response_create(err), do: err

  def put(config, table, id, body) do
    url = "#{config.uri}/key/#{table}/#{id}"
    headers = config._prepare.headers
    options = []

    HTTPoison.put(url, body, headers, options)
    |> HTTPResponse.build()
    |> response_to_dot()
    |> response_put()
  end

  defp response_put({:ok, [response]}) do
    cond do
      response.status == "ERR" ->
        {:error, response.detail}
      true ->
        item = response.result
        {:create_or_update, item}
    end
  end
  defp response_put(err), do: err

  def update(config, table, id, body) do
    url = "#{config.uri}/key/#{table}/#{id}"
    headers = config._prepare.headers
    options = []

    HTTPoison.patch(url, body, headers, options)
    |> HTTPResponse.build()
    |> response_to_dot()
    |> response_update()
  end

  defp response_update({:ok, [response]}) do
    cond do
      response.status == "ERR" ->
        {:error, response.detail}
      true ->
        item = response.result
        {:create_or_update, item}
    end
  end
  defp response_update(err), do: err

  def delete(config, table, id) do
    url = "#{config.uri}/key/#{table}/#{id}"
    headers = config._prepare.headers
    options = []

    HTTPoison.delete(url, headers, options)
    |> HTTPResponse.build()
    |> response_delete()
  end

  defp response_delete({:ok, [response]}) do
    cond do
      response.status == "ERR" ->
        {:error, response.detail}
      true ->
        {:delete, nil}
    end
  end
  defp response_delete(err), do: err


  defp response_to_dot({:ok, [response]}) do
    response = Response.to_dot_syntax(response)
    {:ok, [response]}
  end
  defp response_to_dot(other), do: other

end