import { describe, expect, test } from "vitest";
import { imageResult, parseAvailableTags } from "./common.js";

const PNG_1X1_BASE64 =
  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Wn8n0sAAAAASUVORK5CYII=";

describe("parseAvailableTags", () => {
  test("returns undefined for non-array inputs", () => {
    expect(parseAvailableTags(undefined)).toBeUndefined();
    expect(parseAvailableTags(null)).toBeUndefined();
    expect(parseAvailableTags("oops")).toBeUndefined();
  });

  test("drops entries without a string name and returns undefined when empty", () => {
    expect(parseAvailableTags([{ id: "1" }])).toBeUndefined();
    expect(parseAvailableTags([{ name: 123 }])).toBeUndefined();
  });

  test("keeps falsy ids and sanitizes emoji fields", () => {
    const result = parseAvailableTags([
      { id: "0", name: "General", emoji_id: null },
      { id: "1", name: "Docs", emoji_name: "📚" },
      { name: "Bad", emoji_id: 123 },
    ]);
    expect(result).toEqual([
      { id: "0", name: "General", emoji_id: null },
      { id: "1", name: "Docs", emoji_name: "📚" },
      { name: "Bad" },
    ]);
  });
});
describe("imageResult", () => {
  test("stores media delivery in details.media instead of MEDIA text", async () => {
    const result = await imageResult({
      label: "test:image",
      path: "/tmp/test.png",
      base64: PNG_1X1_BASE64,
      mimeType: "image/png",
    });

    expect(result.content).toEqual([
      {
        type: "image",
        data: PNG_1X1_BASE64,
        mimeType: "image/png",
      },
    ]);
    expect(result.details).toEqual({
      path: "/tmp/test.png",
      media: {
        mediaUrl: "/tmp/test.png",
      },
    });
  });

  test("keeps extra text without MEDIA text fallback", async () => {
    const result = await imageResult({
      label: "test:image",
      path: "/tmp/test.png",
      base64: PNG_1X1_BASE64,
      mimeType: "image/png",
      extraText: "label text",
    });

    expect(result.content?.[0]).toEqual({
      type: "text",
      text: "label text",
    });
    expect(result.content?.[1]).toEqual({
      type: "image",
      data: PNG_1X1_BASE64,
      mimeType: "image/png",
    });
    expect(JSON.stringify(result.content)).not.toContain("MEDIA:");
  });
});
