/**
 * Vue SFC Module Cache 单例
 * 为 vue3-sfc-loader 提供统一的 moduleCache
 */
import Vue from 'vue'
import Vuex from 'vuex'
import CloudVueSfcComponent from '@vue2-client/base-client/components/VueSfcComponent/CloudVueSfcComponent.vue'
import Vue2ClientLoader from '@vue2-client/utils/module-loader/Vue2ClientModuleLoader'

class VueSfcModuleCache {
  constructor() {
    if (VueSfcModuleCache.instance) {
      return VueSfcModuleCache.instance
    }

    this._cache = new Map()
    this._cachedObject = null
    this._initCache()

    VueSfcModuleCache.instance = this
  }

  /**
   * 初始化 moduleCache
   */
  _initCache() {
    this._cache.set('vue', Vue)
    this._cache.set('vuex', Vuex)
    this._cache.set('VueSfcModuleCache', this)
    this._cache.set('CloudVueSfcComponent', CloudVueSfcComponent)

    // 注入所有已缓存的 @vue2-client 组件
    const vue2ClientComponents = Vue2ClientLoader.getAllComponents()
    vue2ClientComponents.forEach((component, path) => {
      this._cache.set(path, component)
    })
  }

  /**
   * 获取缓存的模块
   * @param {string} key - 模块路径或名称
   * @returns {*}
   */
  get(key) {
    return this._cache.get(key)
  }

  /**
   * 设置缓存的模块
   * @param {string} key - 模块路径或名称
   * @param {*} value - 模块值
   */
  set(key, value) {
    this._cache.set(key, value)
    this._cachedObject = null
  }

  /**
   * 检查模块是否已缓存
   * @param {string} key - 模块路径或名称
   * @returns {boolean}
   */
  has(key) {
    return this._cache.has(key)
  }

  /**
   * 获取所有已缓存的模块（Map 格式）
   * @returns {Map}
   */
  getAll() {
    return new Map(this._cache)
  }

  /**
   * 获取所有已缓存的模块（普通对象格式，供 vue3-sfc-loader 使用）
   * @returns {Object}
   */
  toObject() {
    if (!this._cachedObject) {
      this._cachedObject = Object.fromEntries(this._cache)
    }
    return this._cachedObject
  }

  /**
   * 重置缓存
   */
  reset() {
    this._cache.clear()
    this._cachedObject = null
    this._initCache()
  }
}

// 创建单例
const vueSfcModuleCache = new VueSfcModuleCache()

export default vueSfcModuleCache
