import * as Cesium from 'cesium';

import { VIEWER_OPTIONS_FN } from '../helper/_VIEWER_OPTIONS';
import { configureCesium } from '../helper/configureCesium';
import { configureTimeLine } from '../helper/configureTimeLine';

// Cesium Ion Token 和全局配置，暂时保留在此处，也可考虑移至更全局的初始化位置
Cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_ION_TOKEN;
Object.assign(globalThis, { Cesium });
configureCesium();

export class HCesiumManager {
  viewer: Cesium.Viewer | null = null;

  /**
   * 初始化 Cesium Viewer。
   * @param container - 用于承载 Cesium Viewer 的 DOM 元素或其 ID。
   * @returns 返回创建的 Viewer 实例，如果失败则返回 null。
   */
  init(container: ConstructorParameters<typeof Cesium.Viewer>[0]): Cesium.Viewer | null {
    if (this.viewer) {
      console.warn('Cesium Viewer 已初始化，请先销毁再重新初始化。');
      return this.viewer;
    }

    try {
      this.viewer = new Cesium.Viewer(container, VIEWER_OPTIONS_FN());
      if ($__DEV__) Object.assign(globalThis, { viewer: this.viewer });

      configureTimeLine(this.viewer);

      // 可以在这里添加其他 Viewer 级别的配置
      this.viewer.scene.debugShowFramesPerSecond = true; // 例如 FPS 显示

      console.log('Cesium Viewer 初始化成功。');
      return this.viewer;
    } catch (error) {
      console.error('Cesium Viewer 初始化失败:', error);
      this.viewer = null;
      return null;
    }
  }

  /**
   * 销毁 Cesium Viewer 实例。
   */
  destroy(): void {
    if (this.viewer && !this.viewer.isDestroyed()) {
      try {
        // 在销毁 Viewer 前，确保所有通过此 Manager 添加的实体或数据源已被移除
        // （或者依赖各个子 Manager 在销毁前自行清理）
        // this.viewer.entities.removeAll(); // 谨慎使用，可能会移除不应移除的实体
        // this.viewer.dataSources.removeAll(true); // 谨慎使用

        this.viewer.destroy();
        console.log('Cesium Viewer 已销毁。');
      } catch (error) {
        console.error('销毁 Cesium Viewer 时出错:', error);
      } finally {
        this.viewer = null;
      }
    } else {
      // console.log('Cesium Viewer 未初始化或已被销毁，无需再次销毁。');
      this.viewer = null; // 确保 viewer 为 null
    }
  }

  /**
   * 向 Viewer 添加一个实体。
   * @param entity - 要添加的 Cesium 实体。
   * @returns 返回添加的实体，如果 Viewer 未初始化则返回 null。
   */
  addEntity(entity: Cesium.Entity): Cesium.Entity | null {
    console.debug(`[HCesiumManager] 添加实体: ${entity.name}`);
    if (!this.viewer) {
      console.error('Viewer 未初始化，无法添加实体。');
      return null;
    }
    try {
      return this.viewer.entities.add(entity);
    } catch (error) {
      console.error('添加实体时出错:', error, entity);
      return null;
    }
  }

  /**
   * 根据 ID 从 Viewer 移除一个实体。
   * @param entityId - 要移除的实体的 ID。
   * @returns 如果成功移除则返回 true，否则返回 false。
   */
  removeEntityById(entityId: string): boolean {
    if (!this.viewer) {
      console.error('Viewer 未初始化，无法移除实体。');
      return false;
    }
    try {
      return this.viewer.entities.removeById(entityId);
    } catch (error) {
      console.error(`移除 ID 为 "${entityId}" 的实体时出错:`, error);
      return false;
    }
  }

  /**
   * 根据实体对象从 Viewer 移除一个实体。
   * @param entity - 要移除的实体对象。
   * @returns 如果成功移除则返回 true，否则返回 false。
   */
  removeEntity(entity: Cesium.Entity): boolean {
    if (!this.viewer) {
      console.error('Viewer 未初始化，无法移除实体。');
      return false;
    }
    try {
      return this.viewer.entities.remove(entity);
    } catch (error) {
      console.error('移除实体时出错:', error, entity);
      return false;
    }
  }

  /**
   * 根据 ID 获取 Viewer 中的实体。
   * @param entityId - 要获取的实体的 ID。
   * @returns 返回找到的实体，如果未找到或 Viewer 未初始化则返回 undefined。
   */
  getEntityById(entityId: string): Cesium.Entity | undefined {
    if (!this.viewer) {
      console.error('Viewer 未初始化，无法获取实体。');
      return undefined;
    }
    try {
      return this.viewer.entities.getById(entityId);
    } catch (error) {
      console.error(`获取 ID 为 "${entityId}" 的实体时出错:`, error);
      return undefined;
    }
  }

  /**
   * 获取当前的 Cesium Viewer 实例。
   * @returns 返回 Viewer 实例，如果未初始化则返回 null。
   */
  getViewer(): Cesium.Viewer | null {
    return this.viewer;
  }
}
