import { getCurrentInstance } from 'vue'

class UniPush {
  constructor() {
    this.isUniApp = typeof uni !== 'undefined'
    this.clientId = null
    this.pushEnabled = false
    this.forceNotificationMode = false // 是否使用 force_notification:true 模式
    this.init()
  }

  async init() {
    if (!this.isUniApp) {
      console.warn('当前环境不是uni-app，无法使用uni-push功能')
      return
    }

    try {
      // 获取客户端标识
      const info = await this.getClientInfo()
      uni.showModal({
        title: 'uni-push客户端ID',
        content:JSON.stringify(info),
        showCancel: false
      })
      this.clientId = info.clientId
      console.log('uni-push客户端ID:', this.clientId)
      
      // 监听推送消息
      this.setupPushListener()
      
      this.pushEnabled = true
    } catch (error) {
      console.error('uni-push初始化失败:', error)
    }
  }

  // 获取客户端信息
  getClientInfo() {
    return new Promise((resolve, reject) => {
      if (!this.isUniApp) {
        reject(new Error('非uni-app环境'))
        return
      }

      uni.getPushClientId({
        success: (res) => {
          resolve({
            clientId: res.cid
          })
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }

  // 设置推送监听
  setupPushListener() {
    if (!this.isUniApp) return

    // 统一监听推送消息（适配 force_notification:true 模式）
    uni.onPushMessage((res) => {
      console.log('推送消息类型:', res.type, '内容:', res)
      
      if (res.type === 'click') {
        // 用户点击通知栏消息（在线/离线都会触发）
        console.log('用户点击了推送消息:', res)
        this.handlePushClick(res)
      } else if (res.type === 'receive') {
        // 应用在线时接收到的消息（不使用 force_notification:true 时触发）
        console.log('应用在线收到推送消息:', res)
        this.handlePushMessage(res)
      }
    })
  }

  // 处理推送消息
  handlePushMessage(message) {
    console.log('处理推送消息（使用 force_notification:true 时在线不会触发）:', message)
    
    // 注意：当后端使用 force_notification:true 时，应用在线时不会触发此方法
    // 消息会直接显示在通知栏，用户点击后才会触发 handlePushClick
    
    // 如果不使用 force_notification:true，可以在此处显示本地通知
    if (!this.forceNotificationMode && this.isUniApp && message.data) {
      uni.showNotification({
        title: message.data.title || '新消息',
        content: message.data.content || '您有一条新消息',
        payload: message.data
      })
    }

    // 触发自定义事件
    if (typeof this.onMessage === 'function') {
      this.onMessage(message)
    }
  }

  // 处理推送点击
  handlePushClick(message) {
    // 根据消息内容跳转到对应页面
    if (message.data && message.data.page) {
    //   this.navigateToPage(message.data.page, message.data.params)
    }

    // 触发自定义点击事件
    if (typeof this.onClick === 'function') {
      this.onClick(message)
    }
  }

  // 页面跳转
  navigateToPage(page, params = {}) {
    if (!this.isUniApp) return

    const pages = {
      'home': '/pages/index/index',
      'message': '/pages/message/message',
      'workbench': '/pages/workbench/workbench'
    }

    const path = pages[page] || '/pages/index/index'
    
    uni.navigateTo({
      url: path + '?' + new URLSearchParams(params).toString()
    })
  }

  // 检查推送权限
  checkPermission() {
    return new Promise((resolve) => {
      if (!this.isUniApp) {
        resolve(false)
        return
      }

      uni.getPushProvider({
        success: (res) => {
          resolve(res.provider !== 'none')
        },
        fail: () => {
          resolve(false)
        }
      })
    })
  }

  // 请求推送权限
  requestPermission() {
    return new Promise((resolve, reject) => {
      if (!this.isUniApp) {
        reject(new Error('非uni-app环境'))
        return
      }

      uni.requestPushPermission({
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }

  // 设置推送标签
  setTags(tags) {
    return new Promise((resolve, reject) => {
      if (!this.isUniApp) {
        reject(new Error('非uni-app环境'))
        return
      }

      uni.setPushTags({
        tags: tags,
        success: (res) => {
          resolve(res)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }

  // 获取推送标签
  getTags() {
    return new Promise((resolve, reject) => {
      if (!this.isUniApp) {
        reject(new Error('非uni-app环境'))
        return
      }

      uni.getPushTags({
        success: (res) => {
          resolve(res.tags)
        },
        fail: (err) => {
          reject(err)
        }
      })
    })
  }

  // 设置 force_notification 模式
  setForceNotificationMode(enabled) {
    this.forceNotificationMode = enabled
    console.log(`force_notification 模式: ${enabled ? '已启用' : '已禁用'}`)
  }

  // 销毁推送实例
  destroy() {
    if (this.isUniApp) {
      uni.offPushMessage()
    }
    this.pushEnabled = false
  }
}

// 创建全局推送实例
const pushInstance = new UniPush()

export default pushInstance