defmodule MvWeb.GlobalSettingsLiveTest do
  use MvWeb.ConnCase, async: true
  import Phoenix.LiveViewTest
  alias Mv.Membership

  describe "Global Settings LiveView" do
    setup %{conn: conn} do
      user = create_test_user(%{email: "admin@example.com"})
      conn = conn_with_oidc_user(conn, user)
      {:ok, conn: conn, user: user}
    end

    test "renders the global settings page", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/settings")

      assert html =~ "Club Settings"
      assert html =~ "Settings"
    end

    test "displays current club name", %{conn: conn} do
      # Set initial club name
      {:ok, settings} = Membership.get_settings()
      {:ok, _updated} = Membership.update_settings(settings, %{club_name: "Test Club"})

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

      assert html =~ "Test Club"
    end

    test "can update club name via form", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/settings")

      # Submit form with new club name
      assert view
             |> form("#settings-form", %{setting: %{club_name: "Updated Club Name"}})
             |> render_submit()

      # Check for success message
      assert render(view) =~ "Settings updated successfully"
      assert render(view) =~ "Updated Club Name"
    end

    test "shows error when club_name is empty", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/settings")

      # Submit form with empty club name
      html =
        view
        |> form("#settings-form", %{setting: %{club_name: ""}})
        |> render_submit()

      assert html =~ "must be present"
    end

    test "shows error when club_name is missing", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/settings")

      # Submit form with club_name explicitly set to empty string
      # (Phoenix forms will keep existing value if field is omitted)
      html =
        view
        |> form("#settings-form", %{setting: %{club_name: ""}})
        |> render_submit()

      assert html =~ "must be present"
    end

    test "displays Memberdata section", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/settings")

      assert html =~ "Memberdata" or html =~ "Member Data"
    end

    test "displays flash message after member field visibility update", %{conn: conn} do
      {:ok, view, _html} = live(conn, ~p"/settings")

      # Simulate member field visibility update
      send(view.pid, {:member_field_visibility_updated})

      # Check for flash message
      assert render(view) =~ "updated" or render(view) =~ "success"
    end
  end
end
