import { expect, type Page } from "@playwright/test";

/** Open the app and wait for the authenticated shell (the nav rail) to be ready. */
export async function openApp(page: Page, path = "/"): Promise<void> {
  await page.goto(path);
  await expect(page.getByTestId("nav-feed")).toBeVisible();
}

/** Click a top-level module in the nav rail and confirm it becomes the active page. */
export async function gotoPage(page: Page, id: string): Promise<void> {
  await page.getByTestId(`nav-${id}`).click();
  await expect(page.getByTestId(`nav-${id}`)).toHaveAttribute("aria-current", "page");
}

/**
 * Click a channel link that is currently WITHIN the viewport — what a real user does. Never use
 * `.first()` for this after scrolling: the first rendered card lives in the virtualizer's overscan
 * ABOVE the viewport, so Playwright would scroll it into view to click it, moving the scroll
 * position — fatal to any test that then asserts on where the feed was. Returns false if none found.
 */
export async function clickVisibleChannelLink(page: Page): Promise<boolean> {
  const links = page.getByTestId("video-card-channel").filter({ visible: true });
  const viewport = page.viewportSize();
  const height = viewport?.height ?? 800;
  const count = await links.count();
  for (let i = 0; i < count; i++) {
    const box = await links.nth(i).boundingBox();
    if (box && box.y >= 0 && box.y + box.height <= height) {
      await links.nth(i).click();
      return true;
    }
  }
  return false;
}

/** Open the in-app player from the first feed card (clicks its thumbnail link). */
export async function openFirstVideo(page: Page): Promise<void> {
  await expect(page.getByTestId("video-card").first()).toBeVisible();
  await page.getByTestId("video-card").first().getByRole("link").first().click();
  await expect(page.getByTestId("player-modal")).toBeVisible();
}
