import { chromium } from "playwright";
import { mkdir, writeFile } from "node:fs/promises";
import path from "node:path";

const baseURL = process.env.PROTOTYPE_URL || "http://127.0.0.1:5174/";
const outDir = path.resolve("qa", "gut-training-guide");
await mkdir(outDir, { recursive: true });

const browser = await chromium.launch({
  headless: true,
  executablePath:
    process.env.BROWSER_PATH ||
    "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe",
});
const page = await browser.newPage({ viewport: { width: 390, height: 844 } });
const consoleErrors = [];
page.on("console", (message) => {
  if (message.type() === "error") consoleErrors.push(message.text());
});

try {
  await page.goto(baseURL, { waitUntil: "networkidle" });
  await page.evaluate(() => localStorage.removeItem("running-ai-prd-v1"));
  await page.reload({ waitUntil: "networkidle" });

  await page.locator(".home-fueling-summary").click();
  await page.getByRole("button", { name: "查看肠胃训练方法" }).waitFor();
  const before = await page.evaluate(() => {
    const state = JSON.parse(localStorage.getItem("running-ai-prd-v1") || "{}");
    return {
      selectedDate: state.selectedDate,
      completedNutritionNodes: state.completedNutritionNodes,
    };
  });

  await page.getByRole("button", { name: "查看肠胃训练方法" }).click();
  await page.getByRole("heading", { name: "让每一次补给，都更从容" }).waitFor();
  for (const heading of ["基本原则", "为什么要练", "这次怎么练"]) {
    await page.getByRole("heading", { name: heading, exact: true }).waitFor();
  }
  await page.screenshot({ path: path.join(outDir, "01-guide.png"), fullPage: true });

  await page.locator(".screen-content").evaluate((element) => {
    element.scrollTop = element.scrollHeight;
  });
  await page.screenshot({ path: path.join(outDir, "02-guide-bottom.png"), fullPage: true });

  await page.getByRole("button", { name: "了解了，继续本次训练" }).click();
  await page.getByRole("button", { name: "查看肠胃训练方法" }).waitFor();
  const after = await page.evaluate(() => {
    const state = JSON.parse(localStorage.getItem("running-ai-prd-v1") || "{}");
    return {
      route: state.route,
      selectedDate: state.selectedDate,
      completedNutritionNodes: state.completedNutritionNodes,
    };
  });
  if (after.route !== "NUT-01") throw new Error(`returned to ${after.route}`);
  if (after.selectedDate !== before.selectedDate) throw new Error("selected training date changed");
  if (JSON.stringify(after.completedNutritionNodes) !== JSON.stringify(before.completedNutritionNodes)) {
    throw new Error("nutrition completion state changed");
  }
  if (consoleErrors.length) throw new Error(consoleErrors.join(" | "));

  const result = { ok: true, before, after, consoleErrors };
  await writeFile(path.join(outDir, "result.json"), `${JSON.stringify(result, null, 2)}\n`, "utf8");
  console.log(JSON.stringify(result, null, 2));
} finally {
  await browser.close();
}
