Skip to main content

lib/pomelo_ex/general/company/search_companies.ex

defmodule PomeloEx.General.Company.SearchCompanies do
  @moduledoc false

  alias PomeloEx.Types.General.Companies.SearchCompaniesType

  def execute(%SearchCompaniesType{token: token} = payload) do
    headers = build_headers(token)

    params =
      payload
      |> Map.delete(:token)
      |> to_query_params()
      |> URI.encode_query()

    PomeloEx.Client.request(:get, "/companies/v1/?#{params}", nil, headers)
  end

  defp build_headers(token) do
    [
      {"Content-Type", "application/json"},
      {"Authorization", "Bearer #{token}"}
    ]
  end

  defp to_query_params(%SearchCompaniesType{} = params) do
    params
    |> Map.from_struct()
    |> Enum.map(&format_pair/1)
    |> Enum.filter(&is_tuple/1)
    |> Map.new()
  end

  defp format_pair({_key, nil}), do: nil

  defp format_pair({key, value}) do
    {format_key(key), format_value(value)}
  end

  defp format_key(key) do
    key
    |> Atom.to_string()
    |> parse_key_prefix()
  end

  defp parse_key_prefix("filter_" <> rest), do: "filter[#{rest}]"
  defp parse_key_prefix("page_" <> rest), do: "page[#{rest}]"
  defp parse_key_prefix(other), do: other

  defp format_value(value) when is_list(value), do: Enum.join(value, ",")
  defp format_value(value), do: value
end