defmodule SimpleshopThemeWeb.Admin.DashboardTest do
  use SimpleshopThemeWeb.ConnCase, async: false

  import Phoenix.LiveViewTest
  import SimpleshopTheme.AccountsFixtures
  import SimpleshopTheme.OrdersFixtures
  import SimpleshopTheme.ProductsFixtures

  setup do
    user = user_fixture()
    %{user: user}
  end

  describe "unauthenticated" do
    test "redirects to login", %{conn: conn} do
      {:error, redirect} = live(conn, ~p"/admin")
      assert {:redirect, %{to: path}} = redirect
      assert path == ~p"/users/log-in"
    end
  end

  describe "setup stepper" do
    setup %{conn: conn, user: user} do
      %{conn: log_in_user(conn, user)}
    end

    test "shows stepper with printify form when nothing connected", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/admin")

      assert html =~ "Setup steps"
      assert html =~ "Connect to Printify"
      assert html =~ "Printify API token"
      assert html =~ "Connect Stripe"
      assert html =~ "Go live"
    end

    test "shows stripe form when printify is done", %{conn: conn} do
      conn_fixture = provider_connection_fixture(%{provider_type: "printify"})
      _product = product_fixture(%{provider_connection: conn_fixture})

      {:ok, view, _html} = live(conn, ~p"/admin")

      # Printify step should be completed
      assert has_element?(view, "li:first-child [class*='bg-green-500']")
      # Stripe step should be active with form
      assert has_element?(view, "label", "Secret key")
    end

    test "shows go live button when all services connected", %{conn: conn} do
      conn_fixture = provider_connection_fixture(%{provider_type: "printify"})
      _product = product_fixture(%{provider_connection: conn_fixture})
      {:ok, _} = SimpleshopTheme.Settings.put_secret("stripe_api_key", "sk_test_123")

      {:ok, view, _html} = live(conn, ~p"/admin")

      assert has_element?(view, "button", "Go live")
    end

    test "go live shows celebration", %{conn: conn} do
      conn_fixture = provider_connection_fixture(%{provider_type: "printify"})
      _product = product_fixture(%{provider_connection: conn_fixture})
      {:ok, _} = SimpleshopTheme.Settings.put_secret("stripe_api_key", "sk_test_123")

      {:ok, view, _html} = live(conn, ~p"/admin")

      html = view |> element("button", "Go live") |> render_click()

      assert html =~ "Your shop is live!"
      assert html =~ "View your shop"
      assert html =~ "Customise theme"
    end

    test "hides stepper when shop is live", %{conn: conn} do
      {:ok, _} = SimpleshopTheme.Settings.set_site_live(true)
      {:ok, _view, html} = live(conn, ~p"/admin")

      refute html =~ "Setup steps"
      refute html =~ "Printify API token"
    end

    test "completed steps show summary and are collapsible", %{conn: conn} do
      conn_fixture = provider_connection_fixture(%{provider_type: "printify"})
      _product = product_fixture(%{provider_connection: conn_fixture})

      {:ok, _view, html} = live(conn, ~p"/admin")

      assert html =~ "products synced"
    end
  end

  describe "stats" do
    setup %{conn: conn, user: user} do
      %{conn: log_in_user(conn, user)}
    end

    test "shows stats cards", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/admin")

      assert has_element?(view, "a[href='/admin/orders']", "Orders")
      assert has_element?(view, "a[href='/admin/settings']", "Products")
    end

    test "shows zero state for orders", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/admin")

      assert html =~ "No orders yet"
    end

    test "shows recent orders when they exist", %{conn: conn} do
      order = order_fixture(%{payment_status: "paid"})
      {:ok, _view, html} = live(conn, ~p"/admin")

      assert html =~ order.order_number
      assert html =~ "Recent orders"
    end
  end
end
