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

import { extractFrontmatter, parseSimpleYamlMap } from "#src/yaml-frontmatter";

describe("extractFrontmatter", () => {
  test("returns empty string when no frontmatter delimiter", () => {
    expect(extractFrontmatter("# Hello\nSome content")).toBe("");
  });

  test("returns empty string when only opening delimiter with no closing", () => {
    expect(extractFrontmatter("---\nkey: value")).toBe("");
  });

  test("returns frontmatter body between delimiters", () => {
    const markdown = "---\nissue: 1\ntitle: Test\n---\n# Content";
    expect(extractFrontmatter(markdown)).toBe("issue: 1\ntitle: Test");
  });

  test("returns empty string when file does not start with ---", () => {
    expect(extractFrontmatter("content\n---\nkey: val\n---")).toBe("");
  });

  test("handles CRLF line endings", () => {
    const markdown = "---\r\nissue: 5\r\n---\r\n# Content";
    expect(extractFrontmatter(markdown)).toBe("issue: 5");
  });

  test("returns empty string for empty string input", () => {
    expect(extractFrontmatter("")).toBe("");
  });

  test("returns empty frontmatter for --- \\n--- with nothing between", () => {
    const markdown = "---\n---\n# Content";
    expect(extractFrontmatter(markdown)).toBe("");
  });
});

describe("parseSimpleYamlMap", () => {
  test("returns empty object for empty string", () => {
    expect(parseSimpleYamlMap("")).toEqual({});
  });

  test("parses simple key-value pairs", () => {
    const yaml = "issue: 21\ntitle: Test";
    expect(parseSimpleYamlMap(yaml)).toEqual({ issue: "21", title: "Test" });
  });

  test("strips surrounding quotes from values", () => {
    const yaml = 'title: "My Title"';
    expect(parseSimpleYamlMap(yaml)).toEqual({ title: "My Title" });

    const yaml2 = "title: 'My Title'";
    expect(parseSimpleYamlMap(yaml2)).toEqual({ title: "My Title" });
  });

  test("skips lines without colon or with colon at position 0", () => {
    const yaml = "no separator here\n:starts-with-colon: val\nkey: val";
    const result = parseSimpleYamlMap(yaml);
    expect(result.key).toBe("val");
    expect(result["no separator here"]).toBeUndefined();
  });

  test("skips comment lines", () => {
    const yaml = "# This is a comment\nkey: value";
    expect(parseSimpleYamlMap(yaml)).toEqual({ key: "value" });
  });

  test("skips blank lines", () => {
    const yaml = "\n\nkey: value\n\n";
    expect(parseSimpleYamlMap(yaml)).toEqual({ key: "value" });
  });

  test("parses nested map (child indented under parent)", () => {
    const yaml = "parent:\n  child: nested_value";
    const result = parseSimpleYamlMap(yaml);
    expect(result.parent).toEqual({ child: "nested_value" });
  });

  test("handles multi-line values correctly (second line is new key)", () => {
    const yaml = "key1: val1\nkey2: val2";
    const result = parseSimpleYamlMap(yaml);
    expect(result.key1).toBe("val1");
    expect(result.key2).toBe("val2");
  });

  test("strips quotes from keys", () => {
    const yaml = '"quoted-key": value';
    const result = parseSimpleYamlMap(yaml);
    expect(result["quoted-key"]).toBe("value");
  });
});
