import type { ParsedTriplets, NodeRole } from './triplet-parser';
import { resolveNodeRole } from './triplet-parser';

export type SearchResult = {
  nodeResults: Record<string, { status: 'found' | 'missing'; componentId?: string; type: NodeRole }>;
  missingNodes: string[];
};

/**
 * 對所有節點進行解析，確認每個節點對應的零件 ID。
 *
 * 注意：此步驟只做靜態解析，不做遠端查找。
 * 零件是否真的存在由 component-loader 在執行時決定（Service Binding / KV / URL）。
 *
 * 優先序：
 *   1. Input/Output 角色：自動標記，componentId = 小寫節點名稱
 *   2. config[nodeName].component 已指定：使用 config 提供的 componentId
 *   3. 其他：componentId = 節點名稱（交給 component-loader 在執行時解析）
 */
export function searchNodes(
  parsed: ParsedTriplets,
  config?: Record<string, Record<string, unknown>>,
): SearchResult {
  const nodeResults: Record<string, { status: 'found' | 'missing'; componentId?: string; type: NodeRole }> = {};

  for (const nodeName of parsed.nodeNames) {
    const role = resolveNodeRole(nodeName, parsed);

    if (role === 'Input' || role === 'Output') {
      nodeResults[nodeName] = { status: 'found', componentId: nodeName.toLowerCase(), type: role };
      continue;
    }

    const configComponent = config?.[nodeName]?.component as string | undefined;
    const componentId = configComponent ?? nodeName;
    nodeResults[nodeName] = { status: 'found', componentId, type: role };
  }

  return { nodeResults, missingNodes: [] };
}
