import { queryById } from '@/config/user.js'

/**
 * 订单监控服务
 * 用于在后台监控订单状态变化，特别是归还完成状态
 */
class OrderMonitor {
  constructor() {
    this.activeOrders = new Map() // 存储活跃订单 Map<orderId, {orderData, pageName}>
    this.timer = null
    this.checkInterval = 10000 // 10秒检查一次
    this.isRunning = false
    this.currentPage = null // 当前活跃页面
  }
  
  /**
   * 添加订单到监控队列
   * @param {Object} orderData 订单数据对象，必须包含orderId字段
   * @param {String} pageName 关联的页面名称，默认为'return'
   */
  addOrder(orderData, pageName = 'return') {
    if (!orderData || !orderData.orderId) {
      console.error('添加订单监控失败：无效的订单数据')
      return
    }
    
    console.log(`添加订单到监控队列: ${orderData.orderId}, 页面: ${pageName}`)
    this.activeOrders.set(orderData.orderId, {
      ...orderData,
      pageName
    })
    
    // 如果监控服务尚未启动，则启动
    if (!this.isRunning) {
      this.start()
    }
  }
  
  /**
   * 移除订单的监控
   * @param {Object} params 包含orderId或pageName的对象
   */
  removeOrder(params) {
    if (!params) return
    
    // 如果提供了orderId，直接删除该订单
    if (params.orderId && this.activeOrders.has(params.orderId)) {
      console.log('从监控队列移除订单:', params.orderId)
      this.activeOrders.delete(params.orderId)
    } 
    // 如果提供了pageName，删除该页面关联的所有订单
    else if (params.pageName) {
      console.log('从监控队列移除页面相关订单:', params.pageName)
      for (const [orderId, data] of this.activeOrders.entries()) {
        if (data.pageName === params.pageName) {
          this.activeOrders.delete(orderId)
        }
      }
    }
    
    // 如果没有订单需要监控了，停止服务
    if (this.activeOrders.size === 0) {
      this.stop()
    }
  }
  
  /**
   * 设置当前活跃页面
   * @param {String} pageName 页面名称
   */
  setActivePage(pageName) {
    this.currentPage = pageName
    console.log('设置当前活跃页面:', pageName)
  }
  
  /**
   * 启动监控服务
   */
  start() {
    if (this.isRunning) return
    
    console.log('启动订单监控服务')
    this.isRunning = true
    this.checkOrders()
    
    this.timer = setInterval(() => {
      this.checkOrders()
    }, this.checkInterval)
  }
  
  /**
   * 停止监控服务
   */
  stop() {
    if (!this.isRunning) return
    
    console.log('停止订单监控服务')
    this.isRunning = false
    
    if (this.timer) {
      clearInterval(this.timer)
      this.timer = null
    }
  }
  
  /**
   * 检查所有活跃订单的状态
   */
  async checkOrders() {
    if (this.activeOrders.size === 0) return
    
    console.log(`检查 ${this.activeOrders.size} 个活跃订单状态, 当前页面: ${this.currentPage}`)
    
    // 只检查当前活跃页面关联的订单，或无页面关联的订单
    for (const [orderId, data] of this.activeOrders.entries()) {
      try {
        // 只在归还页面（或页面未指定时）才执行轮询
        if (!data.pageName || data.pageName === 'return') {
          if (this.currentPage === 'return' || this.currentPage === null) {
            await this.checkOrderStatus(orderId)
          } else {
            // console.log(`跳过订单状态检查: ${orderId}, 当前不在归还页面`)
          }
        }
      } catch (error) {
        // console.error(`检查订单状态失败: ${orderId}`, error)
      }
    }
  }
  
  /**
   * 检查单个订单的状态
   * @param {String} orderId 订单ID
   */
  async checkOrderStatus(orderId) {
    try {
      console.log(`检查订单 ${orderId} 的状态`)
      const result = await queryById(orderId)
      
      if (result.code === 200 && result.data) {
        const orderData = result.data
        const existingData = this.activeOrders.get(orderId)
        const pageName = existingData ? existingData.pageName : null
        
        // 更新本地存储的订单数据，保留页面关联信息
        this.activeOrders.set(orderId, {
          ...orderData,
          pageName
        })
        
        // 检查订单是否已完成
        if (orderData.orderStatus === 'used_done' || orderData.orderStatus === 'used_down') {
          console.log(`订单 ${orderId} 已完成!`)
          
          // 触发全局事件
          uni.$emit('orderCompleted', orderData)
          
          // 显示全局通知
          uni.showToast({
            title: '风扇归还成功',
            icon: 'success',
            duration: 2000
          })
          
          // 播放通知声音（如果需要）
          const innerAudioContext = uni.createInnerAudioContext()
          innerAudioContext.src = '/static/audio/return_success.mp3'
          innerAudioContext.play()
          
          // 完成的订单不再需要监控
          this.removeOrder({orderId})
          
          // 如果用户不在归还页面，则显示归还成功弹窗
          setTimeout(() => {
            uni.showModal({
              title: '归还成功',
              content: '风扇已归还成功，剩余押金将退还到您的账户',
              confirmText: '查看详情',
              success: (res) => {
                if (res.confirm) {
                  // 跳转到归还成功页面查看详情
                  uni.redirectTo({
                    url: `/pages/order/return-success?orderId=${orderId}`
                  })
                }
              }
            })
          }, 500)
        }
      }
    } catch (error) {
      console.error(`检查订单 ${orderId} 状态出错:`, error)
    }
  }
}

// 导出单例实例
export const orderMonitor = new OrderMonitor()

// 监听页面切换事件
uni.onAppRoute((route) => {
  const pagePath = route.path || ''
  const pageSegments = pagePath.split('/')
  const pageName = pageSegments[pageSegments.length - 1]
  
  // 设置当前活跃页面
  orderMonitor.setActivePage(pageName || null)
  
  console.log('页面切换:', pagePath, '当前活跃页面:', pageName)
})

// 页面加载时自动恢复监控上次的活跃订单（如果有）
const initOrderMonitor = () => {
  const lastActiveOrderId = uni.getStorageSync('activeOrderId')
  if (lastActiveOrderId) {
    const lastOrderData = { orderId: lastActiveOrderId }
    orderMonitor.addOrder(lastOrderData, 'return')
  }
}

// 初始化
initOrderMonitor() 