import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

test("PR project filter honors pin refresh and archived placement", WEB, async ({t3, app, screen, browser}) => {
  const alpha = await t3.project("alpha-old");
  const beta = await t3.project("beta-new");
  await t3.project("gamma-archived");
  const first = await t3.thread({project: alpha, title: "Alpha earlier work", messages: ["hello"]});
  await t3.open(first);
  const picker = () => screen.getByRole("combobox", "Filter threads by project").tap();
  const close = () => browser.keyboard.press("Escape");
  const pin = async (action: string) => {
    await picker();
    await screen.getByRole("option", "alpha-old").hover();
    await browser.locator(`button[title^="${action} alpha-old"]`).tap();
    await close();
  };
  await pin("Pin");
  await t3.thread({project: beta, title: "Beta newer activity", messages: ["hello"]});
  await browser.evaluate(async () => {
    const snapshot = await (await fetch("/api/projects")).json();
    const project = snapshot.projects.find((p: {title:string}) => p.title === "gamma-archived");
    const response = await fetch("/api/projects/mutate", {method:"POST", headers:{"content-type":"application/json"}, body: JSON.stringify({type:"project.update", commandId:crypto.randomUUID(), projectId:project.id, archived:true})});
    if (!response.ok) throw new Error(`Archive failed: ${response.status}`);
  });
  await app.open("/pull-requests");
  await picker();
  await app.screenshot("sidebar-pinned-alpha-first");
  await close();
  const orders: string[][] = [];
  const captureFilter = async (label: string) => {
    await screen.getByRole("button", "Filters").tap();
    await screen.getByRole("menuitem", /Project/).tap();
    await screen.getByRole("menuitemradio", "All projects").waitFor({state:"visible"});
    await browser.evaluate(async () => { await Promise.all(document.getAnimations().filter(a => a.effect?.getTiming().iterations !== Infinity).map(a => a.finished.catch(() => {}))); });
    await app.screenshot(label);
    orders.push(await screen.getByRole("menuitemradio").allTextContents());
    await close();
    await close();
  };
  await captureFilter("pr-pinned-and-archived");
  await pin("Unpin");
  await t3.thread({project: beta, title: "Beta after unpin", messages: ["hello"]});
  await captureFilter("pr-after-unpin");
  await pin("Pin");
  await t3.thread({project: beta, title: "Beta after repin", messages: ["hello"]});
  await captureFilter("pr-after-repin");
  await expect(orders).toEqual([
    ["All projects", "AO alpha-old", "BN beta-new", "GA gamma-archived"],
    ["All projects", "BN beta-new", "AO alpha-old", "GA gamma-archived"],
    ["All projects", "AO alpha-old", "BN beta-new", "GA gamma-archived"],
  ]);
});
