"use strict";

const { chromium } = require("playwright");
const {
  BASE_URL,
  UI_TIMEOUT_MS,
  assert,
  cleanupDocuments,
  ensureAuthenticated,
  prepareTempTreeFixture,
  openDocument,
  requireMnoteWebSmokeBaseUrl,
} = require("./tree-shell-smoke-helpers");

async function openRuntimeDebug(page, fixture) {
  const runtimeBaseUrl = requireMnoteWebSmokeBaseUrl();
  await page.goto(`${BASE_URL}/api/auth/mnote-web-token`, { waitUntil: "commit", timeout: UI_TIMEOUT_MS });
  await page.goto(
    `${runtimeBaseUrl}/document-debug?documentId=${fixture.parentId}&workspaceId=${fixture.workspaceId}&host=task104-smoke`,
    { waitUntil: "commit", timeout: UI_TIMEOUT_MS },
  );
  await page.getByText("Document Runtime Debug").waitFor({ state: "visible", timeout: UI_TIMEOUT_MS });
}

async function main() {
  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext({
    viewport: { width: 1440, height: 960 },
  });
  const page = await context.newPage();

  let fixture = null;
  let caughtError = null;

  try {
    await ensureAuthenticated(page, context.request);
    fixture = await prepareTempTreeFixture(context.request);
    await openDocument(page, fixture.workspaceId, fixture.parentId);
    await openRuntimeDebug(page, fixture);

    const textarea = page.locator("textarea[data-block-input-id]").first();
    await textarea.waitFor({ state: "visible", timeout: UI_TIMEOUT_MS });
    await textarea.click({ timeout: UI_TIMEOUT_MS });
    await textarea.fill("你好 runtime input", { timeout: UI_TIMEOUT_MS });

    await page.locator("#editor-save-status").getByText("saved").waitFor({
      state: "visible",
      timeout: UI_TIMEOUT_MS,
    });

    const value = await textarea.inputValue();
    assert(value === "你好 runtime input", `输入值不符合预期：${value}`);

    const selection = await page.locator("#editor-selection-id").textContent();
    assert(selection && selection.includes("_block_1"), `selection 未更新到真实输入块：${selection}`);

    const eventLog = (await page.locator("#editor-event-log").textContent()) || "";
    assert(
      eventLog.includes("human_editor_input.beforeinput"),
      `未记录 beforeinput runtime 标记：${eventLog}`,
    );

    console.log(
      JSON.stringify(
        {
          ok: true,
          baseUrl: BASE_URL,
          workspaceId: fixture.workspaceId,
          documentId: fixture.parentId,
          selection,
        },
        null,
        2,
      ),
    );
  } catch (error) {
    caughtError = error;
  } finally {
    if (fixture) {
      try {
        await cleanupDocuments(context.request, fixture.createdIds);
      } catch (cleanupError) {
        if (!caughtError) {
          caughtError = cleanupError;
        }
      }
    }
    await page.close().catch(() => undefined);
    await context.close().catch(() => undefined);
    await browser.close().catch(() => undefined);
  }

  if (caughtError) {
    throw caughtError;
  }
}

main().catch((error) => {
  console.error(error instanceof Error ? error.stack || error.message : String(error));
  process.exit(1);
});
