import { ref, onUnmounted } from 'vue';

/**
 * Cesium 资源生命周期管理
 *
 * 职责：
 * 1. 统一管理 Cesium 事件监听器的注册和清理
 * 2. 管理 ScreenSpaceEventHandler 的生命周期
 * 3. 管理定时器和动画帧的清理
 * 4. 防止内存泄漏和 WebGL 资源耗尽
 *
 * @returns {Object} 资源管理 API
 */
export function useCesiumLifecycle() {
  // 存储所有需要清理的资源
  const eventHandlers = ref([]);
  const postRenderListeners = ref([]);
  const timeouts = ref([]);
  const intervals = ref([]);
  const animationFrames = ref([]);

  /**
   * 注册 ScreenSpaceEventHandler
   * @param {Cesium.ScreenSpaceEventHandler} handler - 事件处理器
   */
  const registerEventHandler = (handler) => {
    if (handler && !eventHandlers.value.includes(handler)) {
      eventHandlers.value.push(handler);
    }
  };

  /**
   * 注册 postRender 监听器
   * @param {Cesium.Scene} scene - Cesium 场景
   * @param {Function} callback - 回调函数
   * @returns {Function} 移除监听器的函数
   */
  const registerPostRenderListener = (scene, callback) => {
    if (!scene || !callback) {
      console.warn('[useCesiumLifecycle] 无效的 scene 或 callback');
      return () => {};
    }

    // 添加监听器
    scene.postRender.addEventListener(callback);

    // 保存引用
    const listener = { scene, callback };
    postRenderListeners.value.push(listener);

    // 返回移除函数
    return () => {
      scene.postRender.removeEventListener(callback);
      const index = postRenderListeners.value.indexOf(listener);
      if (index > -1) {
        postRenderListeners.value.splice(index, 1);
      }
    };
  };

  /**
   * 注册定时器
   * @param {number} timeoutId - setTimeout 返回的 ID
   */
  const registerTimeout = (timeoutId) => {
    if (timeoutId) {
      timeouts.value.push(timeoutId);
    }
  };

  /**
   * 注册间隔定时器
   * @param {number} intervalId - setInterval 返回的 ID
   */
  const registerInterval = (intervalId) => {
    if (intervalId) {
      intervals.value.push(intervalId);
    }
  };

  /**
   * 注册动画帧
   * @param {number} frameId - requestAnimationFrame 返回的 ID
   */
  const registerAnimationFrame = (frameId) => {
    if (frameId) {
      animationFrames.value.push(frameId);
    }
  };

  /**
   * 清理所有注册的资源
   */
  const cleanup = () => {
    console.log('[useCesiumLifecycle] 开始清理资源...');

    // 1. 销毁所有事件处理器
    eventHandlers.value.forEach((handler) => {
      try {
        if (handler && !handler.isDestroyed()) {
          handler.destroy();
        }
      } catch (error) {
        console.error('[useCesiumLifecycle] 销毁事件处理器失败:', error);
      }
    });
    eventHandlers.value = [];

    // 2. 移除所有 postRender 监听器
    postRenderListeners.value.forEach(({ scene, callback }) => {
      try {
        if (scene && callback) {
          scene.postRender.removeEventListener(callback);
        }
      } catch (error) {
        console.error('[useCesiumLifecycle] 移除 postRender 监听器失败:', error);
      }
    });
    postRenderListeners.value = [];

    // 3. 清除所有定时器
    timeouts.value.forEach((timeoutId) => {
      try {
        clearTimeout(timeoutId);
      } catch (error) {
        console.error('[useCesiumLifecycle] 清除定时器失败:', error);
      }
    });
    timeouts.value = [];

    // 4. 清除所有间隔定时器
    intervals.value.forEach((intervalId) => {
      try {
        clearInterval(intervalId);
      } catch (error) {
        console.error('[useCesiumLifecycle] 清除间隔定时器失败:', error);
      }
    });
    intervals.value = [];

    // 5. 取消所有动画帧
    animationFrames.value.forEach((frameId) => {
      try {
        cancelAnimationFrame(frameId);
      } catch (error) {
        console.error('[useCesiumLifecycle] 取消动画帧失败:', error);
      }
    });
    animationFrames.value = [];

    console.log('[useCesiumLifecycle] 资源清理完成');
  };

  // 组件卸载时自动清理
  onUnmounted(() => {
    cleanup();
  });

  return {
    // 注册方法
    registerEventHandler,
    registerPostRenderListener,
    registerTimeout,
    registerInterval,
    registerAnimationFrame,

    // 清理方法
    cleanup,

    // 状态（用于调试）
    getResourceCount: () => ({
      eventHandlers: eventHandlers.value.length,
      postRenderListeners: postRenderListeners.value.length,
      timeouts: timeouts.value.length,
      intervals: intervals.value.length,
      animationFrames: animationFrames.value.length,
    }),
  };
}
