// 节点元数据统一管理文件
// 从JSON文件的metadata字段动态加载节点元数据

import { markRaw } from 'vue'
import GenericNode from '../components/Nodes/GenericNode.vue'
import MultiOutputNode from '../components/Nodes/MultiOutputNode.vue'

// 组件映射（直接使用文件名）
const COMPONENT_MAP = {
  GenericNode,
  MultiOutputNode
}

// 根据组件类型解析Vue组件
function resolveComponent(componentType) {
  return COMPONENT_MAP[componentType] || GenericNode
}

// 发现所有节点的元数据（从本地JSON文件）
function discoverNodeMetadata() {
  // 使用 import.meta.glob 获取所有节点JSON文件
  // 注意：Vite 要求以 './' 或 '/' 开头，别名在 glob 中不可用
  // 从当前文件路径 ../../../../../../../ 指向到项目根，再进入 apps/jingrow/nodes 目录（core 比原 features 深一层）
  const modulesNew = import.meta.glob('../../../../../../../../apps/jingrow/jingrow/ai/pagetype/local_ai_agent/nodes/**/*.json', { eager: true })
    
  const metadataMap = {}
  
  Object.keys(modulesNew).forEach(path => {
    try {
      const module = modulesNew[path]
      const data = module.default || module
      
      // 检查是否有 metadata 字段
      if (data && typeof data === 'object' && data.metadata && data.metadata.type) {
        metadataMap[data.metadata.type] = data.metadata
      }
    } catch (error) {
      // 静默失败，避免污染控制台
    }
  })
  return metadataMap
}

// 自动生成节点分组
function generateNodeGroups(metadataMap) {
  const groupMap = {}
  
  Object.values(metadataMap).forEach(metadata => {
    const group = metadata.group || '其他'
    if (!groupMap[group]) {
      groupMap[group] = {
        group: group,
        label: group,
        types: []
      }
    }
    groupMap[group].types.push(metadata.type)
  })
  
  return Object.values(groupMap)
}

// 节点元数据映射（同步初始化）
const NODE_METADATA_MAP = {}
const LOCAL_METADATA = discoverNodeMetadata()

// 构建最终的元数据映射
Object.keys(LOCAL_METADATA).forEach(type => {
  const metadata = LOCAL_METADATA[type]
  NODE_METADATA_MAP[type] = {
    ...metadata,
    component: resolveComponent(metadata.component_type)
  }
})

// 自动生成节点分组
const NODE_GROUPS = generateNodeGroups(NODE_METADATA_MAP)

// 导出函数
export function getNodeMetadataByType(type) {
  return NODE_METADATA_MAP[type]
}

export function getAllNodeTypes() {
  return Object.values(NODE_METADATA_MAP)
}

export function getNodeGroups() {
  return NODE_GROUPS
}

export function getNodeComponents() {
  const components = {}
  Object.keys(NODE_METADATA_MAP).forEach(type => {
    if (NODE_METADATA_MAP[type].component) {
      components[type] = NODE_METADATA_MAP[type].component
    }
  })
  return components
}

// 导出常量
export { NODE_METADATA_MAP, NODE_GROUPS }