import { act } from "react";
import { createRoot, type Root } from "react-dom/client";
import { MemoryRouter, Route, Routes, useLocation } from "react-router-dom";
import { afterEach, describe, expect, it, vi } from "vitest";
import AuthGuard from "./AuthGuard";

const authState = {
  isAuthenticated: false,
  isLoading: false,
  activeNavigator: undefined as string | undefined,
  error: undefined as Error | undefined,
  removeUser: vi.fn(),
};

vi.mock("react-oidc-context", () => ({
  useAuth: () => authState,
}));

function LocationProbe() {
  const location = useLocation();
  return (
    <div data-testid="location">
      {location.pathname}
      {location.search}
    </div>
  );
}

function renderGuard(initialEntry: string) {
  const container = document.createElement("div");
  document.body.appendChild(container);
  const root = createRoot(container);

  act(() => {
    root.render(
      <MemoryRouter initialEntries={[initialEntry]}>
        <Routes>
          <Route element={<AuthGuard />}>
            <Route path="/embed/picker" element={<div>picker</div>} />
          </Route>
          <Route path="/login" element={<LocationProbe />} />
        </Routes>
      </MemoryRouter>,
    );
  });

  return { container, root };
}

function cleanupRendered(container: HTMLDivElement, root: Root) {
  act(() => {
    root.unmount();
  });
  container.remove();
}

describe("OrgFront AuthGuard auto login redirects", () => {
  afterEach(() => {
    vi.clearAllMocks();
    authState.isAuthenticated = false;
    authState.isLoading = false;
    authState.activeNavigator = undefined;
    authState.error = undefined;
    window.localStorage.clear();
  });

  it("redirects protected picker entry to the auto login URL", () => {
    const rendered = renderGuard(
      "/embed/picker?mode=single&select=tenant&tenantId=hanmac-family-id",
    );

    expect(rendered.container.textContent).toBe(
      "/login?auto=1&returnTo=%2Fembed%2Fpicker%3Fmode%3Dsingle%26select%3Dtenant%26tenantId%3Dhanmac-family-id",
    );
    cleanupRendered(rendered.container, rendered.root);
  });
});
