/**
 * VSLAM 建图预览相关 API 接口
 * 对应 robot_map_editor 的 httpGetVSlamStatistics 等方法
 */

import request from '@/utils/request'

/**
 * 获取 VSLAM 统计信息
 * @param {string} mapName - 地图名称
 * @returns {Promise} { keyframes: 数量, closures: 闭环数, running: true/false }
 */
export function getVSlamStatistics(mapName) {
  return request({
    url: '/v1/vslam/statistics',
    baseURL: '/pns',
    method: 'get',
    params: { map: mapName }
  })
}

/**
 * 获取关键帧点云数据（Protobuf 格式）
 * @param {string} mapName - 地图名称
 * @param {number} idx - 关键帧索引
 * @returns {Promise<ArrayBuffer>} 点云数据
 */
export function getKeyframePointcloud(mapName, idx) {
  return request({
    url: '/v1/vslam/keyframe/cloud',
    baseURL: '/pns',
    method: 'get',
    params: { map: mapName, idx },
    responseType: 'arraybuffer',
    headers: {
      'Content-Type': 'application/x-protobuf',
      'Accept': 'application/x-protobuf'
    }
  })
}

/**
 * 获取关键帧变换矩阵（Protobuf 格式）
 * @param {string} mapName - 地图名称
 * @param {number} idx - 关键帧索引
 * @returns {Promise<ArrayBuffer>} 变换矩阵数据
 * 数据结构：{ r11-r33: 旋转矩阵, tx, ty, tz: 平移向量, closure: 闭环索引, index: 帧索引 }
 */
export function getKeyframeTrans(mapName, idx) {
  return request({
    url: '/v1/vslam/keyframe/trans',
    baseURL: '/pns',
    method: 'get',
    params: { map: mapName, idx },
    responseType: 'arraybuffer',
    headers: {
      'Content-Type': 'application/x-protobuf',
      'Accept': 'application/x-protobuf'
    }
  })
}

/**
 * 获取闭环详情
 * @param {string} mapName - 地图名称
 * @param {number} idx - 闭环索引
 * @returns {Promise} 闭环信息
 */
export function getClosureDetails(mapName, idx) {
  return request({
    url: '/v1/vslam/closure/details',
    baseURL: '/pns',
    method: 'get',
    params: { map: mapName, idx }
  })
}

/**
 * ==============================================
 * URL 生成器（供 Web Workers 使用）
 * ==============================================
 */

/**
 * 生成统计信息 URL
 * @param {string} mapName - 地图名称
 * @returns {string} 完整 URL
 */
export function urlVSlamStatistics(mapName) {
  return `/pns/v1/vslam/statistics?map=${mapName}`
}

/**
 * 生成关键帧点云 URL
 * @param {string} mapName - 地图名称
 * @param {number} idx - 关键帧索引
 * @returns {string} 完整 URL
 */
export function urlKeyframePointcloud(mapName, idx) {
  return `/pns/v1/vslam/keyframe/cloud?map=${mapName}&idx=${idx}`
}

/**
 * 生成关键帧变换矩阵 URL
 * @param {string} mapName - 地图名称
 * @param {number} idx - 关键帧索引
 * @returns {string} 完整 URL
 */
export function urlKeyframeTrans(mapName, idx) {
  return `/pns/v1/vslam/keyframe/trans?map=${mapName}&idx=${idx}`
}

/**
 * ==============================================
 * Protobuf 数据解析器
 * ==============================================
 * 注意：需要先安装 google-protobuf 并生成 *_pb.js 文件
 */

// 延迟加载 Protobuf 解析器（避免构建时找不到文件）
let kfcloud = null
let kftrans = null

/**
 * 初始化 Protobuf 解析器
 */
function initProtobuf() {
  if (!kfcloud || !kftrans) {
    try {
      kfcloud = require('@/datastruct/proto/pointcloud_pb')
      kftrans = require('@/datastruct/proto/transform_pb')
    } catch (err) {
      console.warn('Protobuf 文件未找到，请先配置 Protobuf:', err)
    }
  }
}

/**
 * 解析点云数据（Protobuf → JSON）
 * @param {ArrayBuffer|Uint8Array} data - 原始数据
 * @returns {Object} 解析后的点云对象 { index, pointsList: [{x, y, z}] }
 */
export function parsePointcloudData(data) {
  initProtobuf()
  if (!kfcloud) {
    throw new Error('Protobuf 解析器未初始化')
  }
  
  const uint8Array = data instanceof Uint8Array ? data : new Uint8Array(data)
  return kfcloud.PointcloudType.deserializeBinary(uint8Array).toObject()
}

/**
 * 解析变换矩阵（Protobuf → JSON）
 * @param {ArrayBuffer|Uint8Array} data - 原始数据
 * @returns {Object} 解析后的变换矩阵 { r11-r33, tx, ty, tz, closure, index }
 */
export function parseTransformData(data) {
  initProtobuf()
  if (!kftrans) {
    throw new Error('Protobuf 解析器未初始化')
  }
  
  const uint8Array = data instanceof Uint8Array ? data : new Uint8Array(data)
  return kftrans.Transform.deserializeBinary(uint8Array).toObject()
}

/**
 * ==============================================
 * 辅助函数
 * ==============================================
 */

/**
 * 批量获取关键帧点云
 * @param {string} mapName - 地图名称
 * @param {Array<number>} indices - 索引数组
 * @param {Function} progressCallback - 进度回调 (current, total)
 * @returns {Promise<Array>} 点云数据数组
 */
export async function batchGetKeyframePointcloud(mapName, indices, progressCallback) {
  const results = []
  
  for (let i = 0; i < indices.length; i++) {
    try {
      const data = await getKeyframePointcloud(mapName, indices[i])
      const parsed = parsePointcloudData(data)
      results.push(parsed)
      
      if (progressCallback) {
        progressCallback(i + 1, indices.length)
      }
    } catch (err) {
      console.error(`获取关键帧 ${indices[i]} 失败:`, err)
      results.push(null)
    }
  }
  
  return results
}

/**
 * 批量获取关键帧变换矩阵
 * @param {string} mapName - 地图名称
 * @param {Array<number>} indices - 索引数组
 * @param {Function} progressCallback - 进度回调 (current, total)
 * @returns {Promise<Array>} 变换矩阵数组
 */
export async function batchGetKeyframeTrans(mapName, indices, progressCallback) {
  const results = []
  
  for (let i = 0; i < indices.length; i++) {
    try {
      const data = await getKeyframeTrans(mapName, indices[i])
      const parsed = parseTransformData(data)
      results.push(parsed)
      
      if (progressCallback) {
        progressCallback(i + 1, indices.length)
      }
    } catch (err) {
      console.error(`获取变换矩阵 ${indices[i]} 失败:`, err)
      results.push(null)
    }
  }
  
  return results
}

