import { describe, it, expect } from "vitest";
import { ComponentRegistry } from "../src/registry.js";

describe("ComponentRegistry", () => {
  const registry = new ComponentRegistry();

  it("loads all components", () => {
    const all = registry.listComponents();
    expect(all.length).toBeGreaterThan(30);
  });

  it("finds by exact name", () => {
    const comp = registry.getComponent("Dialog");
    expect(comp).toBeDefined();
    expect(comp?.meta.name).toBe("Dialog");
  });

  it("finds case-insensitive", () => {
    const lower = registry.getComponent("dialog");
    const upper = registry.getComponent("DIALOG");
    expect(lower).toBeDefined();
    expect(upper).toBeDefined();
    expect(lower?.meta.name).toBe("Dialog");
  });

  it("returns undefined for unknown component", () => {
    const comp = registry.getComponent("NonExistentWidget");
    expect(comp).toBeUndefined();
  });

  it("searches by description keyword", () => {
    const results = registry.search("modal overlay");
    expect(results.length).toBeGreaterThan(0);
    const names = results.map((r) => r.meta.name);
    expect(names).toContain("Dialog");
  });

  it("searches by intent — searchable dropdown finds Combobox", () => {
    const results = registry.search("searchable dropdown");
    expect(results.length).toBeGreaterThan(0);
    const names = results.map((r) => r.meta.name);
    expect(names).toContain("Combobox");
  });

  it("returns json schemas for dialog", () => {
    const comp = registry.getComponent("dialog");
    expect(comp).toBeDefined();
    expect(comp?.jsonSchemas).toBeDefined();
    expect(Object.keys(comp?.jsonSchemas ?? {}).length).toBeGreaterThan(0);
  });

  it("reports hasStyledVersion correctly for dialog", () => {
    const comp = registry.getComponent("dialog");
    expect(comp).toBeDefined();
    expect(typeof comp?.hasStyledVersion).toBe("boolean");
    expect(comp?.hasStyledVersion).toBe(true);
  });
});
