import { describe, it, expect } from "vitest";
import { parseRis, parseEndnoteXml, parseEnw, parseCitationFile } from "../services/citation-parsers.js";

describe("parseRis", () => {
  it("parses a standard RIS record", () => {
    const ris = `TY  - JOUR\nAU  - Smith, John\nTI  - Test Paper\nJO  - Journal of Tests\nVL  - 5\nIS  - 2\nSP  - 100\nEP  - 110\nPY  - 2023\nDO  - 10.1234/test\nAB  - An abstract.\nER  -`;
    const result = parseRis(ris);
    expect(result.title).toBe("Test Paper");
    expect(result.authors).toContain("Smith, John");
    expect(result.year).toBe(2023);
    expect(result.doi).toBe("10.1234/test");
    expect(result.pages).toBe("100-110");
  });
  it("throws if title is missing", () => {
    expect(() => parseRis("TY  - JOUR\nAU  - Smith\nER  -")).toThrow();
  });
});

describe("parseEndnoteXml", () => {
  it("parses a standard EndNote XML record", () => {
    const xml = `<?xml version="1.0"?><xml><records><record><ref-type name="Journal Article">17</ref-type><contributors><authors><author>Jones, Alice</author></authors></contributors><titles><title>XML Paper</title><secondary-title>Test Journal</secondary-title></titles><volume>3</volume><number>1</number><pages>1-10</pages><dates><year>2022</year></dates><electronic-resource-num>10.5678/xml</electronic-resource-num><abstract>Some abstract.</abstract></record></records></xml>`;
    const result = parseEndnoteXml(xml);
    expect(result.title).toBe("XML Paper");
    expect(result.authors).toContain("Jones, Alice");
    expect(result.year).toBe(2022);
    expect(result.doi).toBe("10.5678/xml");
  });
});

describe("parseEnw", () => {
  it("parses an ENW record", () => {
    const enw = `%0 Journal Article\n%T ENW Paper\n%A Brown, Bob\n%J Science\n%V 10\n%D 2021\n%R 10.9999/enw\n%X ENW abstract text.`;
    const result = parseEnw(enw);
    expect(result.title).toBe("ENW Paper");
    expect(result.year).toBe(2021);
    expect(result.doi).toBe("10.9999/enw");
  });
});

describe("parseCitationFile", () => {
  it("dispatches by format", () => {
    const ris = `TY  - JOUR\nTI  - Dispatch Test\nAU  - X, Y\nPY  - 2020\nER  -`;
    const result = parseCitationFile("test.ris", ris, "ris");
    expect(result.title).toBe("Dispatch Test");
  });
});
