// initComponents：把所有內建零件上架到 Component Registry（via Service Binding）
import type { Bindings } from '../types';
import { buildComponentDefs } from '../types';

async function publishOne(
  registry: Fetcher,
  def: ReturnType<typeof buildComponentDefs>[number],
): Promise<{ id: string; status: number; ok: boolean; error?: unknown }> {
  const payload = {
    id: def.id,
    name: def.name,
    description: def.description,
    url: def.url,
    method: def.method,
    tags: def.tags,
    input_schema: JSON.stringify(def.input_schema),
    output_schema: JSON.stringify(def.output_schema),
    author: 'u6u-builtins',
    version: '1.0.0',
  };

  const res = await registry.fetch('http://registry/components', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(payload),
  });

  const body = await res.json().catch(() => ({ error: 'parse error' }));
  // 201 = 新建成功；409 = 已存在（也算 ok）
  const isOk = res.status === 201 || res.status === 409 || res.ok;
  return { id: def.id, status: res.status, ok: isOk, ...(!isOk && { error: body }) };
}

export async function initComponents(
  env: Bindings,
): Promise<{ ok: number; failed: number; results: unknown[] }> {
  const defs = buildComponentDefs(env.WORKER_BASE_URL);
  const results = await Promise.all(defs.map(def => publishOne(env.REGISTRY, def)));

  const ok = results.filter(r => r.ok).length;
  const failed = results.filter(r => !r.ok).length;
  return { ok, failed, results };
}
