/**
 * 自动检测版本更新并刷新页面
 * 适用于MES工位长时间运行场景
 */

// 导入Vue实例以使用Element UI组件
import Vue from 'vue'

/**
 * 显示更新通知的函数
 * @param {number} timeDiff 版本时间差（分钟）
 * @param {function} checkForUpdates 检查更新的回调函数
 */
function showUpdateNotification(timeDiff, checkForUpdates) {
  const notification = Vue.prototype.$notify({
    title: '系统更新提醒',
    message: `检测到新版本（${timeDiff}分钟前发布），点击立即更新`,
    type: 'warning',
    duration: 0, // 不自动关闭
    position: 'top-right',
    showClose: true,
    onClick: () => {
      console.log('[AutoRefresh] 用户点击通知更新，刷新页面...')
      notification.close()
      window.location.reload(true)
    },
    onClose: () => {
      console.log('[AutoRefresh] 用户关闭通知，将在10分钟后再次检查')
      setTimeout(checkForUpdates, 10 * 60 * 1000)
    }
  })
}

export function startAutoRefresh() {
  // 记录当前版本的时间戳
  const currentTimestamp = Date.now()
  console.log('[AutoRefresh] 当前版本时间戳：', currentTimestamp, new Date(currentTimestamp).toLocaleString())

  // 用户最后活动时间
  let lastActivityTime = Date.now()

  // 更新活动时间的函数
  const updateActivity = () => {
    lastActivityTime = Date.now()
  }

  // 监听用户活动事件
  const events = ['mousemove', 'keypress', 'click', 'touchstart', 'scroll']
  events.forEach(event => {
    document.addEventListener(event, updateActivity, { passive: true })
  })

  // 检查次数和错误重试延迟
  let checkCount = 0
  let errorDelay = 30 * 1000 // 初始30秒

  // 检查更新的函数
  const checkForUpdates = async () => {
    checkCount++

    try {
      // 检查用户是否空闲（10分钟无操作）
      const idleTime = Date.now() - lastActivityTime
      const isIdle = idleTime > 10 * 60 * 1000

      console.log(`[AutoRefresh] 第${checkCount}次检查更新，用户${isIdle ? '空闲' : '活跃'}（空闲时间：${Math.floor(idleTime / 1000)}秒）`)

      // 获取最新的HTML内容
      const response = await fetch(window.location.href + '?_t=' + Date.now(), {
        method: 'GET',
        cache: 'no-cache',
        headers: {
          'Cache-Control': 'no-cache, no-store, must-revalidate',
          'Pragma': 'no-cache'
        }
      })

      if (!response.ok) {
        throw new Error(`HTTP错误！状态：${response.status}`)
      }

      const html = await response.text()

      // 使用正则匹配JS文件中的时间戳
      // 匹配模式：js/文件名.时间戳.hash.js
      const timestampRegex = /js\/[^"]+\.(\d{13})\.[a-f0-9]{8}\.js/
      const match = html.match(timestampRegex)

      if (match && match[1]) {
        const newTimestamp = parseInt(match[1])

        console.log('[AutoRefresh] 检测到的版本时间戳：', newTimestamp, new Date(newTimestamp).toLocaleString())

        // 检查时间戳是否变化（新版本的时间戳应该更大）
        if (newTimestamp > currentTimestamp) {
          console.log('[AutoRefresh] 发现新版本！')

          // 根据用户状态决定更新策略
          if (isIdle) {
            // 用户空闲，直接刷新
            console.log('[AutoRefresh] 用户空闲，3秒后自动刷新页面...')

            // 给用户3秒时间看到控制台信息
            setTimeout(() => {
              window.location.reload(true)
            }, 3000)
          } else {
            // 用户活跃，使用更美观的提示方式
            const timeDiff = Math.floor((newTimestamp - currentTimestamp) / 1000 / 60) // 转换为分钟

            // 使用推荐的通知方案（可以根据需要切换到其他方案）
            showUpdateNotification(timeDiff, checkForUpdates)

            return // 跳过本次的定时器设置，由通知函数处理后续逻辑
          }
        } else {
          console.log('[AutoRefresh] 当前已是最新版本')
          // 重置错误延迟
          errorDelay = 30 * 1000
        }
      } else {
        console.warn('[AutoRefresh] 未能从HTML中提取版本时间戳')
      }
    } catch (error) {
      console.error('[AutoRefresh] 检查更新时出错：', error)

      // 错误后增加延迟时间，避免频繁请求
      errorDelay = Math.min(errorDelay * 2, 5 * 60 * 1000) // 最大5分钟
      console.log(`[AutoRefresh] 将在${errorDelay / 1000}秒后重试`)

      // 使用增加的延迟时间
      setTimeout(checkForUpdates, errorDelay)
      return
    }

    // 正常情况下，每30秒检查一次
    setTimeout(checkForUpdates, 30 * 1000)
  }

  // 页面加载5分钟后开始检查（避免刚部署就提示更新）
  const startDelay = 5 * 60 * 1000
  console.log(`[AutoRefresh] 自动更新检查将在${startDelay / 1000}秒后启动`)

  setTimeout(() => {
    console.log('[AutoRefresh] 自动更新检查已启动')
    checkForUpdates()
  }, startDelay)

  // 返回一个停止函数，供需要时使用
  return () => {
    console.log('[AutoRefresh] 停止自动更新检查')
    events.forEach(event => {
      document.removeEventListener(event, updateActivity)
    })
  }
}