import analytics from './index'
import { PAGE_EVENTS } from '../../constants/events'

/**
 * 页面追踪器
 * 自动追踪页面浏览、停留时长、滚动行为
 */
class PageTracker {
  constructor() {
    // 当前页面信息
    this.currentPage = null
    // 页面进入时间
    this.enterTime = null
    // 上一个页面路径
    this.referrerPage = null
    // 滚动追踪状态
    this.scrollTracked = false
    // 最大滚动位置
    this.maxScrollTop = 0
    // 页面高度
    this.pageHeight = 0
  }

  /**
   * 页面进入
   * @param {string} pagePath - 页面路径
   * @param {string} pageTitle - 页面标题
   * @param {object} pageQuery - 页面参数
   */
  onPageEnter(pagePath, pageTitle = '', pageQuery = {}) {
    // 保存当前页面信息
    this.currentPage = {
      path: pagePath,
      title: pageTitle,
      query: pageQuery,
    }

    // 记录进入时间
    this.enterTime = Date.now()

    // 重置滚动追踪
    this.scrollTracked = false
    this.maxScrollTop = 0

    // 发送页面浏览事件
    analytics.track(PAGE_EVENTS.PAGE_VIEW, {
      page_path: pagePath,
      page_title: pageTitle,
      page_query: pageQuery,
      referrer_page: this.referrerPage || '',
      $current_url: pagePath,
      $title: pageTitle,
    })

    // 更新来源页面
    this.referrerPage = pagePath
  }

  /**
   * 页面离开
   */
  onPageLeave() {
    if (!this.currentPage || !this.enterTime) return

    // 计算停留时长（秒）
    const duration = Math.floor((Date.now() - this.enterTime) / 1000)

    // 计算滚动百分比
    const scrollPercentage = this.pageHeight > 0
      ? Math.min(100, Math.round((this.maxScrollTop / this.pageHeight) * 100))
      : 0

    // 发送页面离开事件
    analytics.track(PAGE_EVENTS.PAGE_LEAVE, {
      page_path: this.currentPage.path,
      page_title: this.currentPage.title,
      duration: duration,
      max_scroll_top: this.maxScrollTop,
      scroll_percentage: scrollPercentage,
      $current_url: this.currentPage.path,
    })

    // 重置状态
    this.currentPage = null
    this.enterTime = null
  }

  /**
   * 页面滚动
   * @param {object} scrollInfo - 滚动信息
   */
  onPageScroll(scrollInfo) {
    const { scrollTop, scrollHeight } = scrollInfo

    // 更新最大滚动位置
    if (scrollTop > this.maxScrollTop) {
      this.maxScrollTop = scrollTop
    }

    // 更新页面高度
    if (scrollHeight) {
      this.pageHeight = scrollHeight
    }

    // 首次滚动追踪
    if (!this.scrollTracked && scrollTop > 100) {
      this.scrollTracked = true

      analytics.track(PAGE_EVENTS.PAGE_SCROLLED, {
        page_path: this.currentPage?.path || '',
        scroll_top: scrollTop,
        scroll_direction: 'down',
        first_scroll: true,
      })
    }
  }

  /**
   * 下拉刷新
   */
  onPullDownRefresh() {
    analytics.track(PAGE_EVENTS.PAGE_REFRESH, {
      page_path: this.currentPage?.path || '',
    })
  }

  /**
   * 触底加载更多
   * @param {number} pageNum - 当前页码
   */
  onReachBottom(pageNum = 1) {
    analytics.track(PAGE_EVENTS.PAGE_LOAD_MORE, {
      page_path: this.currentPage?.path || '',
      page_number: pageNum,
    })
  }

  /**
   * 获取当前页面信息
   */
  getCurrentPage() {
    return this.currentPage
  }

  /**
   * 获取停留时长（秒）
   */
  getDuration() {
    if (!this.enterTime) return 0
    return Math.floor((Date.now() - this.enterTime) / 1000)
  }

  /**
   * 设置页面高度（用于计算滚动百分比）
   */
  setPageHeight(height) {
    this.pageHeight = height
  }
}

// 导出单例
export default new PageTracker()