defmodule SqlFmt do
  @moduledoc """
  This library provides an Elixir wrapper around the Rust
  [sqlformat](https://github.com/shssoichiro/sqlformat-rs) library. This allows you
  to efficiently format and pretty print SQL queries.
  """

  alias SqlFmt.FormatOptions
  alias SqlFmt.Native

  @doc """
  This function takes a query as a string along with optional formatting
  settings and returns the formatted query.

  For formatting settings look at the `SqlFmt.FormatOptions` module docs.
  """
  @spec format_query(query :: String.t()) :: {:ok, String.t()}
  @spec format_query(query :: String.t(), fmt_opts :: keyword()) :: {:ok, String.t()}
  def format_query(query, fmt_opts \\ []) do
    format_options = FormatOptions.new(fmt_opts)

    Native.format(query, format_options)
  end

  @doc """
  This function takes a query as a string along with its parameters as a list of strings
  and optional formatting settings and returns the formatted query. As a note, when using this
  function all of the element in `query_params` must be strings and they all must be
  extrapolated out to their appropriate SQL values. For example query params of `["my_id"]`
  should be `["'my_id'"]` so that it is valid SQL when the parameter substitution takes place.

  For formatting settings look at the `SqlFmt.FormatOptions` module docs.
  """
  @spec format_query_with_params(query :: String.t(), query_params :: list(String.t())) :: {:ok, String.t()}
  @spec format_query_with_params(query :: String.t(), query_params :: list(String.t()), fmt_opts :: keyword()) ::
          {:ok, String.t()}
  def format_query_with_params(query, query_params, fmt_opts \\ []) do
    format_options = FormatOptions.new(fmt_opts)

    Native.format(query, query_params, format_options)
  end
end
