defmodule MvWeb.GlobalSettingsLiveConfigTest do
  @moduledoc """
  Tests for GlobalSettingsLive that modify global Application configuration.

  These tests run with `async: false` to prevent race conditions when
  modifying global Application environment variables (Application.put_env).
  This follows the same pattern as Mv.ConfigTest.
  """
  use MvWeb.ConnCase, async: false
  import Phoenix.LiveViewTest

  # Helper function to upload CSV file in tests
  defp upload_csv_file(view, csv_content, filename) do
    view
    |> file_input("#csv-upload-form", :csv_file, [
      %{
        last_modified: System.system_time(:second),
        name: filename,
        content: csv_content,
        size: byte_size(csv_content),
        type: "text/csv"
      }
    ])
    |> render_upload(filename)
  end

  describe "CSV Import - Configuration Tests" do
    setup %{conn: conn} do
      # Ensure admin user
      admin_user = Mv.Fixtures.user_with_role_fixture("admin")
      conn = MvWeb.ConnCase.conn_with_password_user(conn, admin_user)

      {:ok, conn: conn, admin_user: admin_user}
    end

    test "configured row limit is enforced", %{conn: conn} do
      # Business rule: CSV import respects configured row limits
      # Test that a custom limit (500) is enforced, not just the default (1000)
      original_config = Application.get_env(:mv, :csv_import, [])

      try do
        # Arrange: Set custom row limit to 500
        Application.put_env(:mv, :csv_import, max_rows: 500)

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

        # Generate CSV with 501 rows (exceeding custom limit of 500)
        header = "first_name;last_name;email;street;postal_code;city\n"

        rows =
          for i <- 1..501 do
            "Row#{i};Last#{i};email#{i}@example.com;Street#{i};12345;City#{i}\n"
          end

        large_csv = header <> Enum.join(rows)

        # Act: Upload CSV and submit form
        upload_csv_file(view, large_csv, "too_many_rows_custom.csv")

        view
        |> form("#csv-upload-form", %{})
        |> render_submit()

        # Assert: Import should be rejected with error message
        html = render(view)
        # Business rule: import should be rejected when exceeding configured limit
        assert html =~ "Failed to prepare CSV import"
      after
        # Restore original config
        Application.put_env(:mv, :csv_import, original_config)
      end
    end
  end

  describe "Vereinfacht Integration section" do
    setup %{conn: conn} do
      admin_user = Mv.Fixtures.user_with_role_fixture("admin")
      conn = MvWeb.ConnCase.conn_with_password_user(conn, admin_user)
      {:ok, conn: conn}
    end

    @tag :ui
    test "settings page shows Vereinfacht Integration section", %{conn: conn} do
      {:ok, _view, html} = live(conn, ~p"/settings")
      assert html =~ "Vereinfacht"
    end
  end
end
