defmodule PrymnWeb.ServerLive.Index do
  require Logger

  alias Prymn.{Agents, Servers}

  use PrymnWeb, :live_view

  @impl true
  def mount(_params, _session, socket) do
    servers = Servers.list_servers()

    healths =
      if connected?(socket) do
        for %Servers.Server{status: :registered, public_ip: ip} <- servers, into: %{} do
          Agents.subscribe_to_health(ip)
          Agents.start_connection(ip)
          {ip, Agents.get_health(ip)}
        end
      else
        %{}
      end

    {:ok,
     socket
     |> assign(:servers, servers)
     |> assign(:healths, healths)}
  end

  @impl true
  def handle_params(_params, _url, socket) do
    socket =
      case socket.assigns.live_action do
        :new -> assign(socket, :page_title, gettext("Connect a Server"))
        :index -> assign(socket, :page_title, gettext("Listing Servers"))
      end

    {:noreply, socket}
  end

  @impl true
  def handle_info({:connect, %Servers.Server{} = server}, socket) do
    {:noreply,
     socket
     |> update(:servers, fn servers -> [server | servers] end)}
  end

  def handle_info(%Agents.Health{} = health, socket) do
    healths = Map.put(socket.assigns.healths, health.host, health)
    {:noreply, assign(socket, :healths, healths)}
  end

  def handle_info(msg, state) do
    Logger.debug("received unexpected message #{inspect(msg)}")
    {:noreply, state}
  end

  defp server_status(assigns) do
    case {assigns.status, assigns.health} do
      {:unregistered, _} ->
        ~H"""
        <span class="text-gray-500">Needs registration</span>
        """

      {:registered, nil} ->
        ~H"""
        <span class="text-yellow-600">Connecting...</span>
        """

      {:registered, %Agents.Health{message: "Connected"}} ->
        ~H"""
        <span class="text-green-600">Connected</span>
        """

      {:registered, %Agents.Health{message: "Disconnected"}} ->
        ~H"""
        <span class="text-red-600">Disconnected</span>
        """

      {:registered, %Agents.Health{message: message}} ->
        assigns = assign(assigns, :message, message)

        ~H"""
        <span class="text-yellow-900"><%= @message %></span>
        """
    end
  end
end