/**
 * Playwright auth helpers: log in via the API once per role, hydrate
 * localStorage so subsequent page.goto() lands inside the SPA already
 * authenticated.
 *
 * Avoids the per-test cost of driving the LoginPage form just to land on
 * /engagements. The actual UI login flow IS exercised in us2-login.spec.ts.
 */
import { type BrowserContext, type Page } from '@playwright/test';
import { BASE, login, type Role, type User } from './api';

export interface Session {
  token: string;
  user: User;
}

/**
 * Inject token into localStorage so the SPA's bootstrap hook picks it up
 * as if the user had already logged in. The frontend stores the JWT under
 * `mimic.token` (see frontend/src/api/client.ts).
 */
export async function seedTokenInStorage(
  context: BrowserContext,
  token: string,
): Promise<void> {
  await context.addInitScript((t) => {
    try {
      window.localStorage.setItem('mimic.token', t);
    } catch {
      /* storage might not exist on about:blank — harmless */
    }
  }, token);
}

export async function clearAuthStorage(context: BrowserContext): Promise<void> {
  await context.addInitScript(() => {
    try {
      window.localStorage.removeItem('mimic.token');
    } catch {
      /* noop */
    }
  });
}

/**
 * Log in as the given role and return both the API session and a helper
 * that prepares a Page with the auth token already seeded.
 */
export async function loginAs(
  context: BrowserContext,
  username: string,
  password: string,
): Promise<Session> {
  const session = await login(username, password);
  await seedTokenInStorage(context, session.token);
  return session;
}

/**
 * Convenience: navigate to a path on a page that's already had its
 * context seeded with a token.
 */
export async function gotoApp(page: Page, path = '/engagements'): Promise<void> {
  await page.goto(`${BASE}${path}`);
}

export type { Role };
