/**
 * VSLAM 建图预览功能的 Vuex Store 模块
 * 对应 robot_map_editor 的 vslamReducer
 */

const state = {
  // 地图名称
  mapName: '',
  
  // 当前视角模式
  // 1: 俯视图, 2: 第三人称, 3: 第一人称, 4: 当前视角, 5: 自由视角
  currentView: 5,
  
  // 引导模式是否开启
  bootModeIsCheck: false,
  
  // SLAM 运行状态
  runningState: false,
  
  // 机器人位置信息
  robotPosition: {
    x: 0,
    y: 0,
    z: 0
  },
  
  // 机器人模型是否可见
  robotVisiable: false,
  
  // 回放状态（用于触发回放动画）
  replayState: 0,
  
  // 全屏状态
  fullScreen: {
    name: 'webPage', // 'webPage' | 'window'
    state: false
  },
  
  // 编辑类型标志
  editType: false,
  
  // MQTT 可视化对象列表
  mqttVisualBoxList: [],
  
  // 可编辑的对象列表
  editableBoxList: [],
  
  // 手动控制状态
  manualControlState: false,
  
  // 实时视频状态
  realTimeVideoState: false,
  
  // 按钮可见性配置
  btnsVisiable: {
    cameraVisiable: false,
    controlVisiable: true
  },
  
  // RTSP URL
  rtspUrl: '',
  
  // UI 配置
  uiConfig: {
    robotVisiable: true,
    axesHelper: false,
    modelName: 'robot',
    offset: [0, 0, 0]
  },
  
  // 闭环信息列表
  closures: [],
  
  // 当前显示的闭环索引
  show: -1
}

const mutations = {
  /**
   * 设置地图名称
   */
  SET_MAP_NAME(state, mapName) {
    state.mapName = mapName
  },
  
  /**
   * 设置当前视角
   */
  SET_CURRENT_VIEW(state, view) {
    state.currentView = view
  },
  
  /**
   * 设置引导模式
   */
  SET_BOOT_MODE(state, mode) {
    state.bootModeIsCheck = mode
    // 引导模式强制使用俯视图
    if (mode) {
      state.currentView = 1
    }
  },
  
  /**
   * 设置 SLAM 运行状态
   */
  SET_RUNNING_STATE(state, running) {
    state.runningState = running
  },
  
  /**
   * 设置机器人位置
   */
  SET_ROBOT_POSITION(state, position) {
    state.robotPosition = { ...state.robotPosition, ...position }
  },
  
  /**
   * 设置机器人可见性
   */
  SET_ROBOT_VISIABLE(state, visible) {
    state.robotVisiable = visible
  },
  
  /**
   * 设置回放状态
   */
  SET_REPLAY_STATE(state, replayState) {
    state.replayState = replayState
  },
  
  /**
   * 设置全屏状态
   */
  SET_FULL_SCREEN(state, fullScreen) {
    state.fullScreen = fullScreen
  },
  
  /**
   * 设置编辑类型
   */
  SET_EDIT_TYPE(state, editType) {
    state.editType = editType
  },
  
  /**
   * 设置 MQTT 可视化对象列表
   */
  SET_MQTT_BOX_LIST(state, list) {
    state.mqttVisualBoxList = list
  },
  
  /**
   * 添加可视化对象
   */
  ADD_VISUAL_LIST(state, data) {
    state.editableBoxList = data
  },
  
  /**
   * 编辑可视化对象
   */
  EDIT_VISUAL_LIST(state, data) {
    const findIndex = state.editableBoxList.findIndex((item) => {
      return item.properties && data.properties && 
             data.properties.id && item.properties.id === data.properties.id
    })
    
    if (findIndex >= 0) {
      // 编辑已存在的对象
      state.editableBoxList[findIndex] = data
    } else {
      // 添加新对象
      state.editableBoxList.push(data)
    }
    state.editType = true
  },
  
  /**
   * 移除可视化对象
   */
  REMOVE_VISUAL_BOX(state, data) {
    const removeIndex = state.editableBoxList.findIndex((item) => {
      return item.properties && data && item.properties.id === data.id
    })
    
    if (removeIndex >= 0) {
      state.editableBoxList.splice(removeIndex, 1)
    }
    state.editType = true
  },
  
  /**
   * 设置手动控制状态
   */
  SET_MANUAL_CONTROL_STATE(state, manualState) {
    state.manualControlState = manualState
  },
  
  /**
   * 设置实时视频状态
   */
  SET_REALTIME_VIDEO_STATE(state, videoState) {
    state.realTimeVideoState = videoState
  },
  
  /**
   * 设置按钮可见性
   */
  SET_BTNS_VISIABLE(state, btnsVisiable) {
    state.btnsVisiable = btnsVisiable
  },
  
  /**
   * 设置 RTSP URL
   */
  SET_RTSP_URL(state, url) {
    state.rtspUrl = url
  },
  
  /**
   * 设置 UI 配置
   */
  SET_UI_CONFIG(state, config) {
    state.uiConfig = { ...state.uiConfig, ...config }
  },
  
  /**
   * 添加闭环信息
   */
  ADD_CLOSURE_INFO(state, closureInfo) {
    state.closures.push(closureInfo)
  },
  
  /**
   * 设置显示的闭环索引
   */
  SET_CLOSURE_SHOW(state, closureIdx) {
    state.show = closureIdx
  },
  
  /**
   * 清空所有数据
   */
  VSLAM_CLEAR(state) {
    state.closures = []
    state.show = -1
    state.robotPosition = { x: 0, y: 0, z: 0 }
    state.robotVisiable = false
    state.runningState = false
    state.editableBoxList = []
    state.mqttVisualBoxList = []
  }
}

const actions = {
  /**
   * 更新地图名称
   */
  updateMapName({ commit }, mapName) {
    commit('SET_MAP_NAME', mapName)
  },
  
  /**
   * 设置当前视角
   */
  setCurrentView({ commit }, view) {
    commit('SET_CURRENT_VIEW', view)
  },
  
  /**
   * 设置引导模式
   */
  setBootMode({ commit }, mode) {
    commit('SET_BOOT_MODE', mode)
  },
  
  /**
   * 设置运行状态
   */
  setRunningState({ commit }, running) {
    commit('SET_RUNNING_STATE', running)
  },
  
  /**
   * 设置机器人位置
   */
  setRobotPosition({ commit }, position) {
    commit('SET_ROBOT_POSITION', position)
  },
  
  /**
   * 设置机器人可见性
   */
  setRobotVisiable({ commit }, visible) {
    commit('SET_ROBOT_VISIABLE', visible)
  },
  
  /**
   * 设置回放状态
   */
  setReplayState({ commit }, state) {
    commit('SET_REPLAY_STATE', state)
  },
  
  /**
   * 设置全屏状态
   */
  setFullScreen({ commit }, fullScreen) {
    commit('SET_FULL_SCREEN', fullScreen)
  },
  
  /**
   * 设置编辑类型
   */
  setEditType({ commit }, editType) {
    commit('SET_EDIT_TYPE', editType)
  },
  
  /**
   * 设置 MQTT 可视化对象列表
   */
  setMqttBoxList({ commit }, list) {
    commit('SET_MQTT_BOX_LIST', list)
  },
  
  /**
   * 添加可视化对象
   */
  addVisualBoxList({ commit }, data) {
    commit('ADD_VISUAL_LIST', data)
  },
  
  /**
   * 编辑可视化对象
   */
  editVisualBoxList({ commit }, data) {
    commit('EDIT_VISUAL_LIST', data)
  },
  
  /**
   * 移除可视化对象
   */
  removeVisualBox({ commit }, data) {
    commit('REMOVE_VISUAL_BOX', data)
  },
  
  /**
   * 设置手动控制状态
   */
  setManualControlState({ commit }, state) {
    commit('SET_MANUAL_CONTROL_STATE', state)
  },
  
  /**
   * 设置实时视频状态
   */
  setRealTimeVideoState({ commit }, state) {
    commit('SET_REALTIME_VIDEO_STATE', state)
  },
  
  /**
   * 设置按钮可见性
   */
  setBtnsVisiable({ commit }, btnsVisiable) {
    commit('SET_BTNS_VISIABLE', btnsVisiable)
  },
  
  /**
   * 设置 RTSP URL
   */
  setRtspUrl({ commit }, url) {
    commit('SET_RTSP_URL', url)
  },
  
  /**
   * 设置 UI 配置
   */
  setUiConfig({ commit }, config) {
    commit('SET_UI_CONFIG', config)
  },
  
  /**
   * 添加闭环信息
   */
  addClosureInfo({ commit }, closureInfo) {
    commit('ADD_CLOSURE_INFO', closureInfo)
  },
  
  /**
   * 显示闭环
   */
  showClosure({ commit }, closureIdx) {
    commit('SET_CLOSURE_SHOW', closureIdx)
  },
  
  /**
   * 清空所有数据
   */
  vslamClear({ commit }) {
    commit('VSLAM_CLEAR')
  }
}

const getters = {
  // 地图名称
  mapName: state => state.mapName,
  
  // 当前视角
  currentView: state => state.currentView,
  
  // 是否处于引导模式
  isBootMode: state => state.bootModeIsCheck,
  
  // SLAM 是否运行中
  isRunning: state => state.runningState,
  
  // 机器人位置
  robotPosition: state => state.robotPosition,
  
  // 机器人是否可见
  isRobotVisible: state => state.robotVisiable,
  
  // 是否全屏
  isFullScreen: state => state.fullScreen.state,
  
  // 可编辑对象数量
  editableCount: state => state.editableBoxList.length
}

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
}

