import type { ComponentRecord } from "../types";
import { COMPONENT_CATALOG } from "./componentCatalog";

function extractDescription(content: Record<string, unknown> | null): string | null {
  if (!content) return null;
  const keys = ["subtitle", "heading", "description", "story", "title"];
  for (const key of keys) {
    const value = content[key];
    if (typeof value === "string" && value.trim()) {
      return value.trim();
    }
  }
  return null;
}

/** Case-insensitive partial match against name, slug, category, and common content fields. */
export function matchesComponentSearch(component: ComponentRecord, query: string): boolean {
  const q = query.trim().toLowerCase();
  if (!q) return true;

  const description = extractDescription(component.content)?.toLowerCase() ?? "";
  const catalog = COMPONENT_CATALOG[component.slug];
  const catalogText = catalog
    ? [
        catalog.displayName,
        catalog.shortDescription,
        catalog.purpose,
        catalog.layoutType,
        catalog.recommendedUse,
      ].join(" ").toLowerCase()
    : "";

  return (
    component.name.toLowerCase().includes(q) ||
    component.slug.toLowerCase().includes(q) ||
    (component.category?.toLowerCase().includes(q) ?? false) ||
    description.includes(q) ||
    catalogText.includes(q)
  );
}

export function filterComponentsBySearch(
  components: ComponentRecord[],
  search: string,
  categoryFilter = "",
): ComponentRecord[] {
  const query = search.trim();
  return components.filter((component) => {
    if (categoryFilter && component.category !== categoryFilter) return false;
    return matchesComponentSearch(component, query);
  });
}
