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

test("Select All and Copy stays inside the rendered Markdown file", WEB, async ({ t3, app, screen, browser }) => {
  const project = await t3.project("Markdown demo", {
    "selection.md": "A paragraph from the rendered file.\n\n- [ ] Review this task\n",
  });
  await t3.thread({ project, title: "Surrounding conversation", messages: ["This conversation must not be copied."] });
  await t3.open();
  await screen.getByRole("button", "Surrounding conversation, Done, Markdown demo").tap();
  await screen.getByRole("button", "Toggle right panel").tap();
  await screen.getByRole("button", "Add panel surface").tap();
  await screen.getByRole("menuitem", "Files", { exact: false }).tap();
  await screen.getByRole("treeitem", "selection.md").tap();
  const rendered = screen.getByRole("button", "Show rendered markdown");
  if (await rendered.isVisible()) await rendered.tap();
  const pasted: string[] = [];
  const selected: string[] = [];
  for (const toggled of [false, true]) {
    if (toggled) await screen.getByRole("checkbox").tap();
    await screen.getByText("A paragraph from the rendered file.", { exact: true }).tap();
    await browser.keyboard.press("Control+a");
    await app.screenshot(toggled ? "selection-after-checkbox" : "selection-before-checkbox");
    selected.push(await browser.evaluate(() => window.getSelection()?.toString() ?? ""));
    await browser.keyboard.press("Control+c");
    const composer = screen.getByRole("textbox");
    await composer.tap();
    await browser.keyboard.press("Control+v");
    await app.screenshot(toggled ? "pasted-after-checkbox" : "pasted-before-checkbox");
    pasted.push(await browser.evaluate(() => {
      const clone = document.querySelector('[data-testid="composer-editor"]')!.cloneNode(true) as HTMLElement;
      // Rich paste creates a checkbox label for assistive technology, outside the document text.
      clone.querySelectorAll('li > label[contenteditable="false"]').forEach((label) => label.remove());
      clone.querySelectorAll("p, li").forEach((block) => block.append(" "));
      return clone.textContent ?? "";
    }));
    await composer.fill("");
  }
  for (const text of [...selected, ...pasted]) {
    await expect(text.replace(/\s+/g, " ").trim()).toBe("A paragraph from the rendered file. Review this task");
  }
});
