defmodule Livebook.Notebook.Cell.Smart do
  # A cell with evaluable code that is edited through a dedicated UI.
  #
  # Smart cell is supposed to provide the user with an easy, code-free
  # way to achieve a specific task, such as plotting a chart or querying
  # a database. The user interacts with smart cell through UI, while
  # the smart cell generates plain code to be executed. The user can
  # access and take over the underlying code at any point.
  #
  # The available smart cells come from the runtime, therefore they
  # are one of Livebook's extension points.

  defstruct [
    :id,
    :source,
    :chunks,
    :outputs,
    :reevaluate_automatically,
    :kind,
    :attrs,
    :js_view,
    :editor
  ]

  alias Livebook.Utils
  alias Livebook.Notebook.Cell

  @type t :: %__MODULE__{
          id: Cell.id(),
          source: String.t() | :__pruned__,
          chunks: Livebook.Runtime.chunks() | nil,
          outputs: list(Cell.indexed_output()),
          reevaluate_automatically: boolean(),
          kind: String.t() | nil,
          attrs: attrs() | :__pruned__,
          js_view: Livebook.Runtime.js_view() | nil,
          editor: Livebook.Runtime.editor() | nil
        }

  @type attrs :: map()

  @doc """
  Returns an empty cell.
  """
  @spec new() :: t()
  def new() do
    %__MODULE__{
      id: Utils.random_id(),
      source: "",
      chunks: nil,
      outputs: [],
      reevaluate_automatically: false,
      kind: nil,
      attrs: %{},
      js_view: nil,
      editor: nil
    }
  end
end
