const ERROR_CODE_MAP = {
  // 主控服务
  kvm_service_list_error: '获取主控服务列表失败',
  kvm_service_detail_error: '获取主控服务详情失败',
  kvm_service_create_error: '创建主控服务失败',
  kvm_service_update_error: '修改主控服务失败',
  kvm_service_delete_error: '删除主控服务失败',

  // 宿主机组（本地）
  kvm_host_group_list_error: '获取宿主机组列表失败',
  kvm_host_group_sync_error: '同步宿主机组失败',
  kvm_host_group_bind_error: '绑定宿主机组失败',
  kvm_host_group_update_error: '修改宿主机组失败',
  kvm_host_group_delete_error: '删除宿主机组失败',
  kvm_host_group_generate_error: '生成商品失败',
  kvm_host_group_optimal_error: '获取最优主机失败',

  // 宿主机组（远程）
  kvm_remote_host_group_list_error: '获取远程宿主机组列表失败',
  kvm_remote_host_group_detail_error: '获取远程宿主机组详情失败',
  kvm_remote_host_group_tree_error: '获取远程宿主机组树失败',
  kvm_remote_host_group_create_error: '创建远程宿主机组失败',
  kvm_remote_host_group_update_error: '修改远程宿主机组失败',
  kvm_remote_host_group_delete_error: '删除远程宿主机组失败',

  // 宿主机
  kvm_host_list_error: '获取宿主机列表失败',
  kvm_host_detail_error: '获取宿主机详情失败',
  kvm_host_metrics_error: '获取宿主机指标失败',
  kvm_host_add_error: '新增宿主机失败',
  kvm_host_update_error: '修改宿主机失败',
  kvm_host_delete_error: '删除宿主机失败',

  // 镜像
  kvm_image_list_error: '获取镜像列表失败',
  kvm_image_detail_error: '获取镜像详情失败',
  kvm_image_host_status_error: '获取镜像宿主机状态失败',
  kvm_image_create_error: '创建镜像失败',
  kvm_image_update_error: '修改镜像失败',
  kvm_image_delete_error: '删除镜像失败',
  kvm_image_reload_error: '重新下载镜像失败',
  kvm_image_sync_error: '同步镜像到宿主机失败',
  kvm_image_reload_host_error: '重新下载镜像到宿主机失败',

  // 网络
  kvm_network_list_error: '获取网络列表失败',
  kvm_network_detail_error: '获取网络详情失败',
  kvm_network_create_error: '创建网络失败',
  kvm_network_update_error: '修改网络失败',
  kvm_network_delete_error: '删除网络失败',

  // 数据卷
  kvm_volume_list_error: '获取数据卷列表失败',
  kvm_volume_detail_error: '获取数据卷详情失败',
  kvm_volume_create_error: '创建数据卷失败',
  kvm_volume_resize_error: '调整数据卷大小失败',
  kvm_volume_mount_error: '挂载数据卷失败',
  kvm_volume_unmount_error: '卸载数据卷失败',
  kvm_volume_transfer_error: '迁移数据卷失败',
  kvm_volume_delete_error: '删除数据卷失败',

  // 虚拟机
  kvm_vm_list_error: '获取虚拟机列表失败',
  kvm_vm_detail_error: '获取虚拟机详情失败',
  kvm_vm_status_error: '获取虚拟机状态失败',
  kvm_vm_metrics_error: '获取虚拟机指标失败',
  kvm_vm_create_error: '创建虚拟机失败',
  kvm_vm_update_error: '修改虚拟机失败',
  kvm_vm_rebuild_error: '重建虚拟机失败',
  kvm_vm_refactor_error: '重构虚拟机失败',
  kvm_vm_update_traffic_error: '修改虚拟机带宽失败',
  kvm_vm_start_error: '启动虚拟机失败',
  kvm_vm_stop_error: '停止虚拟机失败',
  kvm_vm_reboot_error: '重启虚拟机失败',
  kvm_vm_suspend_error: '暂停虚拟机失败',
  kvm_vm_resume_error: '恢复虚拟机失败',
  kvm_vm_rescue_error: '进入救援系统失败',
  kvm_vm_exit_rescue_error: '退出救援系统失败',
  kvm_vm_delete_error: '删除虚拟机失败',

  // 安全组
  kvm_post_group_list_error: '获取安全组列表失败',
  kvm_post_group_detail_error: '获取安全组详情失败',
  kvm_post_group_create_error: '创建安全组失败',
  kvm_post_group_update_error: '修改安全组失败',
  kvm_post_group_sync_error: '同步安全组失败',
  kvm_post_group_bind_error: '绑定安全组失败',
  kvm_post_group_unbind_error: '解绑安全组失败',
  kvm_post_group_delete_error: '删除安全组失败',
  kvm_post_group_enable_whitelist_error: '开启安全组白名单失败',
  kvm_post_group_disable_whitelist_error: '关闭安全组白名单失败',
  kvm_post_group_create_rule_error: '新增安全组规则失败',
  kvm_post_group_update_rule_error: '修改安全组规则失败',
  kvm_post_group_delete_rule_error: '删除安全组规则失败',
  kvm_post_group_apply_error: '应用安全组失败',
  kvm_security_group_list_error: '获取安全组列表失败',
  kvm_security_group_detail_error: '获取安全组详情失败',
  kvm_security_group_create_error: '创建安全组失败',
  kvm_security_group_update_error: '修改安全组失败',
  kvm_security_group_delete_error: '删除安全组失败',

  // VNC
  kvm_vnc_list_error: '获取VNC节点列表失败',
  kvm_vnc_add_error: '新增VNC节点失败',
  kvm_vnc_test_error: '测试VNC节点连接失败',
  kvm_vnc_update_error: '修改VNC节点失败',
  kvm_vnc_delete_error: '删除VNC节点失败',
  kvm_vnc_vm_vnc_error: '获取VNC连接信息失败',
}

/**
 * 从嵌套的 RPC 错误字符串中提取有意义的中文描述
 */
function parseRpcError(err) {
  if (!err) return ''
  const descMatch = err.match(/desc\s*=\s*(.+)/)
  if (descMatch) {
    const descContent = descMatch[1]
    const jsonMatch = descContent.match(/body=(\{.+\})/)
    if (jsonMatch) {
      try {
        const parsed = JSON.parse(jsonMatch[1])
        if (parsed.message) return parsed.message
      } catch { /* ignore */ }
    }
    const clean = descContent.trim()
    if (clean && !clean.startsWith('http')) return clean
  }
  return ''
}

/**
 * 统一提取 API 响应中的错误信息
 * @param {object} body - axios response.data (即 { code, message, error, data })
 * @param {string} fallback - 兜底文案
 * @returns {string} 中文错误描述
 */
export function extractApiError(body, fallback = '操作失败') {
  if (!body) return fallback

  // 识别数据库唯一约束冲突
  if (body.error && body.error.includes('duplicate key value violates unique constraint')) {
    const nameMatch = body.error.match(/create \w+ \[(.+?)\] error/)
    const hint = nameMatch ? `「${nameMatch[1]}」已存在，请勿重复生成` : '数据已存在，请勿重复操作'
    return hint
  }

  const rpcMsg = parseRpcError(body.error)
  if (rpcMsg) return rpcMsg

  const mapped = ERROR_CODE_MAP[body.message]
  if (mapped) return mapped

  if (body.message && !/^[a-z_]+$/.test(body.message)) return body.message

  return fallback
}
