defmodule MicrowavepropWeb.SkewtLiveTest do
  use MicrowavepropWeb.ConnCase, async: false

  import Phoenix.LiveViewTest

  describe "GET /skewt" do
    test "renders search bar with no results when no query is supplied", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/skewt")

      assert html =~ "Skew-T-Log-P"
      assert html =~ ~s|placeholder="EM12kp|
      refute html =~ "viewBox=\"0 0 720"
    end

    test "initial render with a URL query shows the page chrome + a loading indicator", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/skewt?q=EM12kp")

      assert html =~ "Skew-T-Log-P"
      assert html =~ ~s|placeholder="EM12kp|
      assert html =~ "Resolving location"
      refute html =~ "EM12KP"
    end

    test "after the async completes the resolved location label appears", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      html = render_async(view)

      assert html =~ "EM12KP"
      assert html =~ "32.646"
      assert html =~ "-97.125"
      refute html =~ "Resolving location"
    end

    test "submitting the form patches the URL with the query", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt")

      view |> form("form", q: "EM12") |> render_submit()

      assert render_async(view) =~ "EM12"
    end

    test "shows info alert when no HRRR profiles are stored", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      html = render_async(view)

      assert html =~ "No HRRR profiles are currently stored"
      assert has_element?(view, ".alert.alert-info")
    end

    test "time selector is not shown when there are no valid times", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      render_async(view)

      refute has_element?(view, "button[phx-click=select_time]")
    end

    test "loading indicator visible while async is in flight", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      assert has_element?(view, ".loading")
      assert render(view) =~ "Resolving location"
    end

    test "on successful async the loading state is cleared and location shown", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      html = render_async(view)

      refute html =~ "Resolving location"
      assert html =~ "EM12KP"
      assert html =~ "32.646"
    end

    test "coordinates are formatted with 3 decimal places", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/skewt?q=EM12kp")

      html = render_async(view)

      assert html =~ "32.646"
      assert html =~ "-97.125"
    end
  end
end
