import { describe, expect, it } from "vitest";

import { extractDraftQuotes, locateInDraft } from "./locate";

const TEXT = "第一段没问题。\n\n他乘坐迈巴赫扬长而去，留下一地尘土。\n\n结尾。";

describe("locateInDraft", () => {
  it("locates the exact original fragment", () => {
    const loc = locateInDraft(TEXT, { original: "迈巴赫", where: "第2段" });
    expect(loc).not.toBeNull();
    expect(TEXT.slice(loc!.start, loc!.end)).toBe("迈巴赫");
  });

  it("falls back to the paragraph snippet when no original", () => {
    const loc = locateInDraft(TEXT, { original: null, where: "第2段" });
    expect(loc).not.toBeNull();
    expect(TEXT.slice(loc!.start, loc!.end)).toBe(
      "他乘坐迈巴赫扬长而去，留下一地尘土。",
    );
  });

  it("returns null when original is absent from text and no paragraph hint", () => {
    expect(
      locateInDraft(TEXT, { original: "保时捷", where: "无段号" }),
    ).toBeNull();
  });

  it("returns null when the snippet paragraph is out of range", () => {
    expect(locateInDraft(TEXT, { original: null, where: "第9段" })).toBeNull();
  });

  it("locates via quoted draft text inside where (no original, no 段号)", () => {
    // 真实形态：where = 草稿中写"<草稿原文>"，引号内即正文精确子串。
    const loc = locateInDraft(TEXT, {
      original: null,
      where: '草稿中写"迈巴赫扬长而去"',
    });
    expect(loc).not.toBeNull();
    expect(TEXT.slice(loc!.start, loc!.end)).toBe("迈巴赫扬长而去");
  });
});

describe("extractDraftQuotes", () => {
  it("extracts quoted spans (multiple quote styles) longest-first, deduped", () => {
    expect(extractDraftQuotes('草稿中写"长一些的原文"，又如「短的」')).toEqual([
      "长一些的原文",
      "短的",
    ]);
  });

  it("returns empty when there are no quotes", () => {
    expect(extractDraftQuotes("第3段，主角忽然示弱")).toEqual([]);
  });
});
