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

const baseURL = process.env.PROTOTYPE_URL || "http://127.0.0.1:5174/";
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 outputDir = path.resolve("qa", "artifacts", "device-authorization");
const consoleErrors = [];
page.on("console", (message) => {
  if (message.type() === "error") consoleErrors.push(message.text());
});

try {
  const url = new URL(baseURL);
  url.searchParams.set("route", "DEV-01");
  await page.goto(url.toString(), { waitUntil: "networkidle" });
  await page.waitForFunction(() => Boolean(localStorage.getItem("running-ai-prd-v1")));
  await mkdir(outputDir, { recursive: true });
  await page.evaluate(() => {
    const state = JSON.parse(localStorage.getItem("running-ai-prd-v1"));
    state.route = "DEV-01";
    state.profileComplete = false;
    state.authMode = "authenticated";
    state.device = {
      ...state.device,
      provider: "",
      connectedProviders: [],
      syncSources: [],
      status: "idle",
      authorizingProvider: "",
    };
    localStorage.setItem("running-ai-prd-v1", JSON.stringify(state));
  });
  await page.reload({ waitUntil: "networkidle" });
  await page.getByText("平台同步为可选项", { exact: true }).waitFor();
  await page.evaluate(() => history.replaceState({}, "", "/"));
  const skipSyncButton = page.getByRole("button", { name: "暂不同步，继续制定计划" });
  await skipSyncButton.waitFor();
  await page.screenshot({ path: path.join(outputDir, "00-optional-sync.png") });
  await skipSyncButton.click();
  await page.getByText("把你的训练节奏定下来", { exact: true }).waitFor();
  const skippedState = await page.evaluate(
    () => JSON.parse(localStorage.getItem("running-ai-prd-v1")),
  );
  if (skippedState.route !== "PLAN-02")
    throw new Error("暂不同步后未进入下一步 PLAN-02");

  await page.goto(url.toString(), { waitUntil: "networkidle" });
  await page.evaluate(() => {
    const state = JSON.parse(localStorage.getItem("running-ai-prd-v1"));
    state.route = "DEV-01";
    state.profileComplete = true;
    state.authMode = "authenticated";
    state.device = {
      ...state.device,
      provider: "华为健康",
      connectedProviders: ["华为健康"],
      syncSources: ["华为健康"],
      status: "connected",
      authorizingProvider: "",
    };
    localStorage.setItem("running-ai-prd-v1", JSON.stringify(state));
  });
  await page.reload({ waitUntil: "networkidle" });
  await page.getByText("让训练数据陪你一起进步", { exact: true }).waitFor();
  await page.getByRole("button", { name: "暂不更新数据，完成设置" }).waitFor();

  const appleRow = page.locator(".provider-row").filter({ hasText: "Apple Health" });
  const appleTrigger = appleRow.getByRole("button", { name: "连接" });
  await appleTrigger.click();
  const dialog = page.getByRole("dialog", { name: "授权 Apple Health" });
  await dialog.waitFor();
  await dialog.getByText("仅申请读取", { exact: true }).waitFor();
  await dialog.getByRole("button", { name: "使用本机健康权限一键授权" }).waitFor();
  await dialog.getByRole("button", { name: "使用Apple ID登录" }).waitFor();
  if ((await page.locator("main.screen-content").getAttribute("aria-hidden")) !== "true")
    throw new Error("授权弹窗打开后，底层页面未隔离");
  await page.screenshot({ path: path.join(outputDir, "01-apple-one-click.png") });

  await dialog.getByRole("button", { name: "使用Apple ID登录" }).click();
  await dialog.getByLabel("Apple ID").fill("runner@example.com");
  await dialog.getByLabel("密码").fill("prototype-password");
  await page.screenshot({ path: path.join(outputDir, "02-apple-account-login.png") });
  await dialog.getByRole("button", { name: "登录并授权" }).click();
  await dialog.locator(".provider-auth-success").waitFor();
  await page.getByRole("dialog", { name: "授权 Apple Health" }).waitFor({ state: "detached" });
  await appleRow.getByText("已连接", { exact: true }).waitFor();
  const connectedProviders = await page.evaluate(
    () => JSON.parse(localStorage.getItem("running-ai-prd-v1")).device.connectedProviders,
  );
  if (!connectedProviders.includes("Apple Health"))
    throw new Error("Apple Health 授权成功后未写回设备状态");

  const xiaomiTrigger = page
    .locator(".provider-row")
    .filter({ hasText: "小米运动健康" })
    .getByRole("button", { name: "连接" });
  await xiaomiTrigger.click();
  await page.getByRole("dialog", { name: "授权 小米运动健康" }).waitFor();
  await page.keyboard.press("Escape");
  await page.getByRole("dialog", { name: "授权 小米运动健康" }).waitFor({ state: "detached" });
  await page.waitForFunction(
    () => (document.activeElement instanceof HTMLElement) && document.activeElement.dataset.provider === "小米运动健康",
  );

  await page.evaluate(() => {
    const state = JSON.parse(localStorage.getItem("running-ai-prd-v1"));
    state.authMode = "guest";
    state.device.connectedProviders = state.device.connectedProviders.filter(
      (provider) => provider !== "小米运动健康",
    );
    state.device.authorizingProvider = "";
    localStorage.setItem("running-ai-prd-v1", JSON.stringify(state));
    localStorage.removeItem("running-ai-access-token");
  });
  url.searchParams.set("authGate", "1");
  await page.goto(url.toString(), { waitUntil: "networkidle" });
  const guestXiaomiTrigger = page
    .locator(".provider-row")
    .filter({ hasText: "小米运动健康" })
    .getByRole("button", { name: "连接" });
  await guestXiaomiTrigger.click();
  await page.getByRole("dialog", { name: "登录后连接运动设备" }).waitFor();
  await page.locator(".auth-page--embedded .check-row input").check();
  await page
    .locator(".auth-page--embedded")
    .getByRole("button", { name: "微信一键登录" })
    .click();
  await page.getByRole("button", { name: "授权并登录" }).click();
  await page.getByText("个人模式", { exact: true }).waitFor();
  const xiaomiDialogAfterLogin = page.getByRole("dialog", { name: "授权 小米运动健康" });
  await xiaomiDialogAfterLogin.waitFor();
  await xiaomiDialogAfterLogin
    .getByRole("button", { name: "使用小米账号一键授权" })
    .click();
  await xiaomiDialogAfterLogin.locator(".provider-auth-success").waitFor();
  await page
    .locator(".provider-row")
    .filter({ hasText: "小米运动健康" })
    .getByText("已连接", { exact: true })
    .waitFor();
  const finalProviders = await page.evaluate(
    () => JSON.parse(localStorage.getItem("running-ai-prd-v1")).device.connectedProviders,
  );

  const geometry = await page.evaluate(() => ({
    width: document.documentElement.clientWidth,
    scrollWidth: document.documentElement.scrollWidth,
  }));
  if (geometry.scrollWidth > geometry.width + 1)
    throw new Error(`DEV-01 授权流程存在横向溢出：${JSON.stringify(geometry)}`);
  if (consoleErrors.length)
    throw new Error(`浏览器控制台报错：${consoleErrors.join(" | ")}`);

  console.log(JSON.stringify({
    ok: true,
    optionalSync: "DEV-01 → PLAN-02",
    providers: finalProviders,
    geometry,
    consoleErrors,
    screenshots: outputDir,
  }, null, 2));
} catch (error) {
  console.error(error);
  process.exitCode = 1;
} finally {
  await browser.close();
}
