defmodule Mongo.Ecto.Helpers do
  @moduledoc """
  Defines helpers to ease working with MongoDB in models or other places
  where you work with them. You'd probably want to import it.
  """

  @doc """
  Creates proper regex object that can be passed to the database.

  ## Usage in queries

      from p in Post,
        where: fragment(title: ^regex("elixir", "i"))

  For supported options please see `Mongo.Ecto.Regex` module documentation.
  """
  @spec regex(String.t(), String.t()) :: Mongo.Ecto.Regex.t()
  def regex(pattern, options \\ "") do
    %Mongo.Ecto.Regex{pattern: pattern, options: options}
  end

  @doc """
  Allows updating only a fragment of a nested document

  ## Usage in queries

      MyRepo.update_all(Post,
        set: [meta: change_map("author.name", "NewName")])
  """
  @spec change_map(String.t(), term) :: Mongo.Ecto.ChangeMap.t()
  def change_map(field, value) do
    %Mongo.Ecto.ChangeMap{field: field, value: value}
  end

  @doc """
  Allows updating only a fragment of a nested document inside an array

  ## Usage in queries

      MyRepo.update_all(Post,
        set: [comments: change_array(0, "author", "NewName")])
  """
  @spec change_array(pos_integer, String.t(), term) :: Mongo.Ecto.ChangeArray.t()
  def change_array(idx, field \\ "", value) when is_integer(idx) do
    %Mongo.Ecto.ChangeArray{field: "#{idx}.#{field}", value: value}
  end
end
