defmodule Glific.Searches.Search do
  @moduledoc """
  The Glific Abstraction to represent the conversation with a user. This unifies a vast majority of the
  glific data types including: message, contact, and tag
  """
  alias __MODULE__

  use Ecto.Schema

  alias Glific.{Contacts.Contact, Messages.Message}

  @type t() :: %__MODULE__{
          contacts: Contact.t(),
          messages: Message.t(),
          tags: Message.t(),
          labels: Message.t()
        }

  # structure to hold a contact and the conversations with the contact
  # the messages should be in descending order, i.e. most recent ones first
  embedded_schema do
    embeds_many(:contacts, Contact)
    embeds_many(:messages, Message)
    embeds_many(:tags, Message)
    embeds_many(:labels, Message)
  end

  @doc """
  Create a new conversation. A contact is required for the conversation. Messages can
  be added later on
  """
  @spec new(list(), list(), list(), list()) :: Search.t()
  def new(contacts, messages, tags, labels) do
    %Search{contacts: contacts, messages: messages, tags: tags, labels: labels}
  end
end
