import { describe, expect, it } from "vitest";
import {
  parseCommentContentElements,
  resolveCommentLinkedDocumentFromUrl,
} from "./comment-shared.js";

const VALID_TOKEN_22 = "ABCDEFGHIJKLMNOPQRSTUV";
const VALID_TOKEN_27 = "ZsJfdxrBFo0RwuxteOLc1Ekvneb";

describe("resolveCommentLinkedDocumentFromUrl", () => {
  it.each([
    {
      label: "doc",
      url: `https://example.test/doc/${VALID_TOKEN_22}`,
      expectedKind: "doc",
      expectedResolvedType: "doc",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "docs",
      url: `https://example.test/docs/${VALID_TOKEN_22}`,
      expectedKind: "doc",
      expectedResolvedType: "doc",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/doc",
      url: `https://example.test/space/doc/${VALID_TOKEN_22}`,
      expectedKind: "doc",
      expectedResolvedType: "doc",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "sheet",
      url: `https://example.test/sheet/${VALID_TOKEN_22}`,
      expectedKind: "sheet",
      expectedResolvedType: "sheet",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "sheets",
      url: `https://example.test/sheets/${VALID_TOKEN_22}`,
      expectedKind: "sheet",
      expectedResolvedType: "sheet",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/sheet",
      url: `https://example.test/space/sheet/${VALID_TOKEN_22}`,
      expectedKind: "sheet",
      expectedResolvedType: "sheet",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "docx with hash",
      url: `https://bytedance.larkoffice.com/docx/${VALID_TOKEN_27}#share-Huggdiqveo5N7NxyA01ck4gLnHh`,
      expectedKind: "docx",
      expectedResolvedType: "docx",
      expectedToken: VALID_TOKEN_27,
    },
    {
      label: "mindnote",
      url: `https://example.test/mindnote/${VALID_TOKEN_22}`,
      expectedKind: "mindnote",
      expectedResolvedType: "mindnote",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "mindnotes",
      url: `https://example.test/mindnotes/${VALID_TOKEN_22}`,
      expectedKind: "mindnote",
      expectedResolvedType: "mindnote",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/mindnote",
      url: `https://example.test/space/mindnote/${VALID_TOKEN_22}`,
      expectedKind: "mindnote",
      expectedResolvedType: "mindnote",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "bitable",
      url: `https://example.test/bitable/${VALID_TOKEN_22}?table=tbl_123`,
      expectedKind: "bitable",
      expectedResolvedType: "bitable",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "base",
      url: `https://example.test/base/${VALID_TOKEN_22}`,
      expectedKind: "base",
      expectedResolvedType: "base",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/bitable",
      url: `https://example.test/space/bitable/${VALID_TOKEN_22}`,
      expectedKind: "bitable",
      expectedResolvedType: "bitable",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "file",
      url: `https://example.test/file/${VALID_TOKEN_22}`,
      expectedKind: "file",
      expectedResolvedType: "file",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/file",
      url: `https://example.test/space/file/${VALID_TOKEN_22}`,
      expectedKind: "file",
      expectedResolvedType: "file",
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "wiki",
      url: `https://example.test/wiki/${VALID_TOKEN_22}`,
      expectedKind: "wiki",
      expectedResolvedType: undefined,
      expectedToken: VALID_TOKEN_22,
    },
    {
      label: "space/wiki",
      url: `https://example.test/space/wiki/${VALID_TOKEN_22}`,
      expectedKind: "wiki",
      expectedResolvedType: undefined,
      expectedToken: VALID_TOKEN_22,
    },
  ])("$label", ({ url, expectedKind, expectedResolvedType, expectedToken }) => {
    const linked = resolveCommentLinkedDocumentFromUrl({ rawUrl: url });

    expect(linked.urlKind).toBe(expectedKind);
    expect(linked.resolvedObjType).toBe(expectedResolvedType);
    expect(linked.resolvedObjToken ?? linked.wikiNodeToken).toBe(expectedToken);
  });

  it("does not resolve doc-like paths with short tokens", () => {
    expect(
      resolveCommentLinkedDocumentFromUrl({
        rawUrl: "https://www.baidu.com/docx/guide",
      }),
    ).toEqual({
      rawUrl: "https://www.baidu.com/docx/guide",
      urlKind: "unknown",
    });
  });
});

describe("parseCommentContentElements", () => {
  it("keeps raw external urls in text but excludes unresolved links from structured references", () => {
    const parsed = parseCommentContentElements({
      elements: [
        {
          type: "docs_link",
          docs_link: { url: `https://bytedance.larkoffice.com/docx/${VALID_TOKEN_27}` },
        },
        {
          type: "text_run",
          text_run: { text: " 和 " },
        },
        {
          type: "docs_link",
          docs_link: { url: "https://www.baidu.com/docx/guide" },
        },
      ],
    });

    expect(parsed.plainText).toBe(
      `https://bytedance.larkoffice.com/docx/${VALID_TOKEN_27} 和 https://www.baidu.com/docx/guide`,
    );
    expect(parsed.linkedDocuments).toEqual([
      expect.objectContaining({
        rawUrl: `https://bytedance.larkoffice.com/docx/${VALID_TOKEN_27}`,
        urlKind: "docx",
        resolvedObjType: "docx",
        resolvedObjToken: VALID_TOKEN_27,
      }),
    ]);
  });
});
