defmodule PrymnWeb.ServerLive.Index do
  use PrymnWeb, :live_view

  alias Prymn.Servers

  @impl true
  def mount(_params, _session, socket) do
    # Run this for every server:
    #   make sure an agent connection is made (async "cheap" request)
    #     then wait for events
    #     pubsub will eventually send a connected or a disconnected (and anything else) event
    {:ok, stream(socket, :servers, Servers.list_servers())}
  end

  @impl true
  def handle_params(params, _url, socket) do
    {:noreply, apply_action(socket, socket.assigns.live_action, params)}
  end

  defp apply_action(socket, :new, _params) do
    socket
    |> assign(:page_title, "New Server")
  end

  defp apply_action(socket, :index, _params) do
    socket
    |> assign(:page_title, "Listing Servers")
  end

  @impl true
  def handle_info({:connect, %Servers.Server{} = server}, socket) do
    socket =
      if server.provider == :Custom,
        do: push_navigate(socket, to: ~p"/servers/#{server}"),
        else: stream_insert(socket, :servers, server)

    {:noreply, socket}
  end

  @impl true
  def handle_event("delete", %{"id" => id}, socket) do
    server = Servers.get_server!(id)
    {:ok, _} = Servers.delete_server(server)

    {:noreply, stream_delete(socket, :servers, server)}
  end
end