#!/usr/bin/env node
"use strict";

const assert = require("node:assert/strict");
const fs = require("node:fs");
const path = require("node:path");
const vm = require("node:vm");

const RUNTIME_PATH = path.join(
  process.cwd(),
  "rust/crates/mnote-web/browser/document-tiptap-conversion-runtime.js",
);

function loadConversionRuntime() {
  const source = fs
    .readFileSync(RUNTIME_PATH, "utf8")
    .replace(/\bexport const\s+([A-Za-z0-9_]+)\s*=/g, "const $1 =");
  const sandbox = { console };
  vm.runInNewContext(
    `${source}\n;globalThis.__mnoteExports = { pageBodyTiptapDocumentSource, pageBodyTiptapDocument };`,
    sandbox,
    { filename: RUNTIME_PATH },
  );
  return sandbox.__mnoteExports;
}

function paragraphText(doc) {
  return doc?.content?.[0]?.content?.[0]?.text || "";
}

function firstTableCellText(doc) {
  return doc?.content?.[0]?.content?.[0]?.content?.[0]?.content?.[0]?.content?.[0]?.text || "";
}

function taskItemChecked(doc) {
  return doc?.content?.[0]?.content?.[0]?.attrs?.checked;
}

const {
  pageBodyTiptapDocumentSource,
  pageBodyTiptapDocument,
} = loadConversionRuntime();

const blockDocument = {
  type: "doc",
  content: [{
    type: "paragraph",
    attrs: { blockId: "block-truth" },
    content: [{ type: "text", text: "Block truth" }],
  }],
};

const legacyContent = [{
  id: "legacy-1",
  type: "paragraph",
  content: [{ type: "text", text: "Legacy fallback" }],
}];

const localWithBlockAndLegacy = {
  projectionSource: "local_markdown.content",
  blockDocument,
  content: legacyContent,
};
assert.equal(
  pageBodyTiptapDocumentSource(localWithBlockAndLegacy),
  "page_aggregate.block_document",
);
assert.equal(
  paragraphText(pageBodyTiptapDocument(localWithBlockAndLegacy)),
  "Block truth",
);

const localWithProjectedTable = {
  projectionSource: "local_markdown.content",
  blockDocument: {
    documentId: "local-md:design~2F07-ai~2Fdone~2F7-45-chatonly-api-provider-runtime-v1.md",
    rootBlockIds: ["table-1"],
    blocks: [{
      blockId: "table-1",
      type: "table",
      attrs: {
        tiptapTable: {
          type: "table",
          content: [{
            type: "tableRow",
            content: [{
              type: "tableCell",
              attrs: { colspan: 1, rowspan: 1, colwidth: null },
              content: [{
                type: "paragraph",
                content: [{ type: "text", text: "Provider 类别" }],
              }],
            }],
          }],
        },
      },
      contentNodes: [],
    }],
  },
};
assert.equal(
  firstTableCellText(pageBodyTiptapDocument(localWithProjectedTable)),
  "Provider 类别",
);

const localWithProjectedTodo = {
  projectionSource: "local_markdown.content",
  blockDocument: {
    documentId: "local-md:design~2F07-ai~2Fprocess~2F7-46-document-evidence-retrieval-kernel-v1.md",
    rootBlockIds: ["todo-1"],
    blocks: [{
      blockId: "todo-1",
      type: "todo",
      attrs: { checked: true },
      contentNodes: [{ text: "graph traversal 结果必须带证据引用。", styles: {} }],
    }],
  },
};
assert.equal(
  taskItemChecked(pageBodyTiptapDocument(localWithProjectedTodo)),
  true,
);

const localLegacyOnly = {
  projectionSource: "local_markdown.content",
  content: legacyContent,
};
assert.equal(
  pageBodyTiptapDocumentSource(localLegacyOnly),
  "local_markdown.content",
);
assert.equal(
  paragraphText(pageBodyTiptapDocument(localLegacyOnly)),
  "Legacy fallback",
);

const compatLegacyOnly = {
  content: legacyContent,
};
assert.equal(
  pageBodyTiptapDocumentSource(compatLegacyOnly),
  "compat.legacy_content",
);
assert.equal(
  paragraphText(pageBodyTiptapDocument(compatLegacyOnly)),
  "Legacy fallback",
);

assert.equal(
  pageBodyTiptapDocumentSource({}, "Fallback text"),
  "degraded.fallback_text",
);
assert.equal(
  paragraphText(pageBodyTiptapDocument({}, "Fallback text")),
  "Fallback text",
);

console.log("task522 page aggregate compat fallback contract passed");
