/**
 * 当前界面组件管理插件
 * - 支持按名称注册组件实例、按名称获取组件
 * - 同名重复注册时抛错
 * - 组件销毁时自动从注册表移除
 *
 * 使用方式：
 *   - 注册：this.$componentRegistry.register('main', this)
 *   - 获取：this.$componentRegistry.get('main')
 *   - 判断：this.$componentRegistry.has('main')
 *   - 注销：this.$componentRegistry.unregister('main')
 */

const REGISTRY = new Map()

function createRegistry () {
  return {
    /**
     * 注册组件
     * @param {string} name 组件名称（唯一）
     * @param {import('vue').Vue} component 组件实例（Vue 实例）
     * @throws {Error} 当 name 已存在时
     */
    register (name, component) {
      if (name == null || typeof name !== 'string' || !name.trim()) {
        throw new Error('[ComponentRegistry] 组件名称不能为空')
      }
      const key = name.trim()
      if (REGISTRY.has(key)) {
        throw new Error(`[ComponentRegistry] 组件名称 "${key}" 已存在，不可重复注册`)
      }
      REGISTRY.set(key, component)
      const self = this
      component.$once('hook:beforeDestroy', () => {
        self.unregister(key)
      })
    },

    /**
     * 根据名称获取已注册的组件
     * @param {string} name 组件名称
     * @returns {import('vue').Vue | undefined}
     */
    get (name) {
      if (name == null || typeof name !== 'string') return undefined
      return REGISTRY.get(name.trim())
    },

    /**
     * 判断名称是否已注册
     * @param {string} name 组件名称
     * @returns {boolean}
     */
    has (name) {
      if (name == null || typeof name !== 'string') return false
      return REGISTRY.has(name.trim())
    },

    /**
     * 注销指定名称的组件（仅从注册表移除，不销毁组件）
     * @param {string} name 组件名称
     */
    unregister (name) {
      if (name == null || typeof name !== 'string') return
      REGISTRY.delete(name.trim())
    },

    /**
     * 清空当前所有注册（用于整页切换等场景，慎用）
     */
    clear () {
      REGISTRY.clear()
    }
  }
}

const registryInstance = createRegistry()

const ComponentRegistryPlugin = {
  install (Vue) {
    Vue.prototype.$componentRegistry = registryInstance
    Vue.$componentRegistry = registryInstance
  }
}

export default ComponentRegistryPlugin
