# This is an example of how to create subscriptions. The example app below
# subscribes to two different time intervals ("big ticks" and "little ticks") by
# returning a batch subscription in the `subscribe/1` callback.
#
# Run this example with:
#
#   mix run examples/subscriptions.exs

defmodule SubscriptionsExample do
  # Use the correct Application behaviour
  use Raxol.Core.Runtime.Application
  # Import the View DSL
  import Raxol.View.Elements

  # Alias for subscriptions
  alias Raxol.Core.Runtime.Events.Subscription
  require Raxol.Core.Runtime.Log

  @impl true
  def init(_context) do
    Raxol.Core.Runtime.Log.debug("SubscriptionsExample: init/1")
    # Return the correct tuple with a map model
    {:ok, %{little_ticks: 0, big_ticks: 0}}
  end

  @impl true
  def update(message, model) do
    Raxol.Core.Runtime.Log.debug(
      "SubscriptionsExample: update/2 received message: \#{inspect(message)}"
    )

    case message do
      :little_tick ->
        # Return the correct :ok tuple
        new_model = %{model | little_ticks: model.little_ticks + 1}
        {:ok, new_model, []}

      :big_tick ->
        new_model = %{model | big_ticks: model.big_ticks + 1}
        {:ok, new_model, []}

      _ ->
        {:ok, model, []}
    end
  end

  @impl true
  def subscriptions(_model) do
    Raxol.Core.Runtime.Log.debug("SubscriptionsExample: subscriptions/1")
    # Assuming Subscription API is correct
    Subscription.batch([
      # Send :big_tick every 1000ms
      Subscription.interval(1000, :big_tick),
      # Send :little_tick every 100ms
      Subscription.interval(100, :little_tick)
    ])
  end

  @impl true
  def view(%{little_ticks: little_ticks, big_ticks: big_ticks} = model) do
    Raxol.Core.Runtime.Log.debug("SubscriptionsExample: view/1")
    # Use the Raxol.View.Elements DSL
    view do
      box title: "Subscriptions Example",
          style: [[:padding, 1], [:border, :single]] do
        column style: %{gap: 1} do
          text(content: "Little ticks: \#{little_ticks}")
          text(content: "Big ticks:    \#{big_ticks}")
          text(content: "(Press Ctrl+C to exit)", style: %{margin_top: 1})
        end
      end
    end
  end
end

Raxol.Core.Runtime.Log.info("SubscriptionsExample: Starting Raxol...")
{:ok, _pid} = Raxol.start_link(SubscriptionsExample, [])
Raxol.Core.Runtime.Log.info("SubscriptionsExample: Raxol started. Running...")
