/**
 * 地图操作工具类
 * 提供通用的地图操作方法，供导航页和标定页共同使用
 */

export class MapOperations {
  constructor(mapRef) {
    this.mapRef = mapRef
  }

  /**
   * 放大地图
   */
  zoomIn() {
    if (this.mapRef && this.mapRef.zoomIn) {
      this.mapRef.zoomIn()
      return true
    }
    return false
  }

  /**
   * 缩小地图
   */
  zoomOut() {
    if (this.mapRef && this.mapRef.zoomOut) {
      this.mapRef.zoomOut()
      return true
    }
    return false
  }

  /**
   * 居中到机器人位置
   * @param {Object} robotPosition - 机器人位置信息 {x, y} 或 经纬度
   */
  centerToRobot(robotPosition = null) {
    if (!this.mapRef) {
      return false
    }

    // 如果传入了位置参数，使用传入的位置
    if (robotPosition && (robotPosition.x !== undefined || robotPosition.lng !== undefined)) {
      if (this.mapRef.centerToPosition) {
        this.mapRef.centerToPosition(robotPosition)
        return true
      }
    }

    // 否则尝试调用地图组件的centerToRobot方法
    if (this.mapRef.centerToRobot) {
      this.mapRef.centerToRobot()
      return true
    }

    return false
  }

  /**
   * 适配地图到画布
   */
  fitToCanvas() {
    if (this.mapRef && this.mapRef.fitToCanvas) {
      this.mapRef.fitToCanvas()
      return true
    }
    return false
  }

  /**
   * 更新地图尺寸
   */
  updateSize() {
    if (this.mapRef && this.mapRef.updateSize) {
      this.mapRef.updateSize()
      return true
    }
    return false
  }

  /**
   * 检查地图是否已就绪
   */
  isMapReady() {
    return !!(this.mapRef && this.mapRef.getMap)
  }

  /**
   * 获取地图实例
   */
  getMapInstance() {
    if (this.mapRef && this.mapRef.getMap) {
      return this.mapRef.getMap()
    }
    return null
  }
}

/**
 * 全屏操作工具类
 */
export class FullscreenOperations {
  /**
   * 切换全屏状态
   * @param {HTMLElement} element - 要全屏的元素
   * @param {Function} onStateChange - 状态变化回调
   */
  static toggleFullscreen(element, onStateChange = null) {
    if (!element) return false

    const isCurrentlyFullscreen = !!(
      document.fullscreenElement || 
      document.webkitFullscreenElement || 
      document.mozFullScreenElement
    )

    if (!isCurrentlyFullscreen) {
      // 进入全屏
      const requestFullscreen = element.requestFullscreen || 
        element.webkitRequestFullscreen || 
        element.mozRequestFullScreen

      if (requestFullscreen) {
        requestFullscreen.call(element)
        return true
      }
    } else {
      // 退出全屏
      const exitFullscreen = document.exitFullscreen || 
        document.webkitExitFullscreen || 
        document.mozCancelFullScreen

      if (exitFullscreen) {
        exitFullscreen.call(document)
        return true
      }
    }

    return false
  }

  /**
   * 添加全屏状态监听器
   * @param {Function} callback - 状态变化回调
   */
  static addFullscreenListener(callback) {
    const events = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange']
    const handler = () => {
      const isFullscreen = !!(
        document.fullscreenElement || 
        document.webkitFullscreenElement || 
        document.mozFullScreenElement
      )
      callback(isFullscreen)
    }

    events.forEach(event => {
      document.addEventListener(event, handler)
    })

    // 返回清理函数
    return () => {
      events.forEach(event => {
        document.removeEventListener(event, handler)
      })
    }
  }
}

/**
 * 机器人位置工具类
 */
export class RobotPositionUtils {
  /**
   * 解析坐标字符串
   * @param {String} coordinates - 坐标字符串，如 "(1.813, -63.931, 0.000)"
   * @returns {Object|null} - {x, y, z} 或 null
   */
  static parseCoordinates(coordinates) {
    if (!coordinates || typeof coordinates !== 'string') {
      return null
    }

    // 匹配形如 "(x, y, z)" 的字符串
    const match = coordinates.match(/\(([^,]+),\s*([^,]+),\s*([^)]+)\)/)
    if (!match) {
      return null
    }

    const x = parseFloat(match[1])
    const y = parseFloat(match[2])
    const z = parseFloat(match[3])

    if (isNaN(x) || isNaN(y) || isNaN(z)) {
      return null
    }

    return { x, y, z }
  }

  /**
   * 检查机器人位置是否有效
   * @param {Object} position - 位置对象
   * @returns {Boolean}
   */
  static isValidPosition(position) {
    if (!position) return false
    
    // 检查是否为零点或无效值
    if (position.x === 0 && position.y === 0) return false
    if (isNaN(position.x) || isNaN(position.y)) return false
    
    return true
  }

  /**
   * 从实时信息中获取机器人位置
   * @param {Object} realtimeInfo - 实时信息对象
   * @returns {Object|null}
   */
  static getRobotPosition(realtimeInfo) {
    if (!realtimeInfo || !realtimeInfo.coordinates) {
      return null
    }

    const position = this.parseCoordinates(realtimeInfo.coordinates)
    return this.isValidPosition(position) ? position : null
  }
}
