// 页面通用混入
import auth from '@/common/utils/auth'
import permission from '@/common/utils/permission'
import { formatTime, formatDate, formatNumber } from '@/common/utils/format'

export default {
  data() {
    return {
      // 页面加载状态
      pageLoading: false,
      // 数据加载状态
      dataLoading: false,
      // 页面错误状态
      pageError: null,
      // 当前页码
      currentPage: 1,
      // 每页数量
      pageSize: 20,
      // 是否还有更多数据
      hasMore: true,
      // 搜索关键词
      searchKeyword: '',
      // 搜索定时器
      searchTimer: null
    }
  },

  computed: {
    // 是否已登录
    isLoggedIn() {
      return auth.isLoggedIn()
    },
    
    // 当前用户信息
    currentUser() {
      return auth.getUserInfo()
    },
    
    // 用户头像
    userAvatar() {
      return auth.getUserAvatar()
    },
    
    // 用户昵称
    userNickname() {
      return auth.getUserNickname()
    }
  },

  onLoad(options) {
    // 页面参数
    this.pageOptions = options || {}
    
    // 检查页面访问权限
    if (this.pageConfig) {
      if (!permission.checkPageAccess(this.pageConfig)) {
        return
      }
    }
    
    // 初始化页面数据
    this.initPageData()
  },

  onShow() {
    // 页面显示时的处理
    this.onPageShow()
  },

  onHide() {
    // 页面隐藏时的处理
    this.onPageHide()
  },

  onUnload() {
    // 页面卸载时的处理
    this.onPageUnload()
  },

  onPullDownRefresh() {
    // 下拉刷新
    this.refreshData()
  },

  onReachBottom() {
    // 上拉加载更多
    if (this.hasMore && !this.dataLoading) {
      this.loadMoreData()
    }
  },

  methods: {
    // 初始化页面数据
    initPageData() {
      // 子类可以重写此方法
      this.loadData()
    },

    // 页面显示处理
    onPageShow() {
      // 子类可以重写此方法
    },

    // 页面隐藏处理
    onPageHide() {
      // 清除搜索定时器
      if (this.searchTimer) {
        clearTimeout(this.searchTimer)
        this.searchTimer = null
      }
    },

    // 页面卸载处理
    onPageUnload() {
      // 清除定时器
      if (this.searchTimer) {
        clearTimeout(this.searchTimer)
        this.searchTimer = null
      }
    },

    // 加载数据
    async loadData(refresh = false) {
      // 子类需要重写此方法
      console.warn('loadData method should be implemented in child component')
    },

    // 刷新数据
    async refreshData() {
      try {
        this.currentPage = 1
        this.hasMore = true
        await this.loadData(true)
      } finally {
        uni.stopPullDownRefresh()
      }
    },

    // 加载更多数据
    async loadMoreData() {
      if (!this.hasMore || this.dataLoading) {
        return
      }
      
      this.currentPage++
      await this.loadData(false)
    },

    // 搜索处理
    onSearch(keyword) {
      this.searchKeyword = keyword
      
      // 防抖处理
      if (this.searchTimer) {
        clearTimeout(this.searchTimer)
      }
      
      this.searchTimer = setTimeout(() => {
        this.refreshData()
      }, 500)
    },

    // 显示加载提示
    showLoading(title = '加载中...') {
      uni.showLoading({
        title,
        mask: true
      })
    },

    // 隐藏加载提示
    hideLoading() {
      uni.hideLoading()
    },

    // 显示成功提示
    showSuccess(title, duration = 2000) {
      uni.showToast({
        title,
        icon: 'success',
        duration
      })
    },

    // 显示错误提示
    showError(title, duration = 2000) {
      uni.showToast({
        title,
        icon: 'none',
        duration
      })
    },

    // 显示确认对话框
    showConfirm(content, title = '提示') {
      return new Promise((resolve) => {
        uni.showModal({
          title,
          content,
          success: (res) => {
            resolve(res.confirm)
          },
          fail: () => {
            resolve(false)
          }
        })
      })
    },

    // 显示操作菜单
    showActionSheet(itemList) {
      return new Promise((resolve) => {
        uni.showActionSheet({
          itemList,
          success: (res) => {
            resolve(res.tapIndex)
          },
          fail: () => {
            resolve(-1)
          }
        })
      })
    },

    // 跳转页面
    navigateTo(url, params = {}) {
      // 构建URL参数
      const query = Object.keys(params)
        .map(key => `${key}=${encodeURIComponent(params[key])}`)
        .join('&')
      
      const fullUrl = query ? `${url}?${query}` : url
      
      uni.navigateTo({
        url: fullUrl,
        fail: (error) => {
          console.error('页面跳转失败：', error)
          this.showError('页面跳转失败')
        }
      })
    },

    // 替换页面
    redirectTo(url, params = {}) {
      const query = Object.keys(params)
        .map(key => `${key}=${encodeURIComponent(params[key])}`)
        .join('&')
      
      const fullUrl = query ? `${url}?${query}` : url
      
      uni.redirectTo({
        url: fullUrl,
        fail: (error) => {
          console.error('页面替换失败：', error)
          this.showError('页面跳转失败')
        }
      })
    },

    // 切换标签页
    switchTab(url) {
      uni.switchTab({
        url,
        fail: (error) => {
          console.error('标签页切换失败：', error)
          this.showError('页面跳转失败')
        }
      })
    },

    // 返回上一页
    navigateBack(delta = 1) {
      uni.navigateBack({
        delta,
        fail: (error) => {
          console.error('页面返回失败：', error)
          // 如果返回失败，跳转到首页
          this.switchTab('/pages/index/index')
        }
      })
    },

    // 检查权限
    hasPermission(permission) {
      return auth.hasPermission(permission)
    },

    // 检查角色
    hasRole(role) {
      return auth.hasRole(role)
    },

    // 检查登录状态
    checkLogin() {
      if (!this.isLoggedIn) {
        this.navigateTo('/pages/auth/login')
        return false
      }
      return true
    },

    // 格式化时间
    formatTime(timestamp, format = 'YYYY-MM-DD HH:mm:ss') {
      return formatTime(timestamp, format)
    },

    // 格式化日期
    formatDate(timestamp, format = 'YYYY-MM-DD') {
      return formatDate(timestamp, format)
    },

    // 格式化数字
    formatNumber(number, decimals = 2) {
      return formatNumber(number, decimals)
    },

    // 复制到剪贴板
    copyToClipboard(text) {
      uni.setClipboardData({
        data: text,
        success: () => {
          this.showSuccess('已复制到剪贴板')
        },
        fail: () => {
          this.showError('复制失败')
        }
      })
    },

    // 拨打电话
    makePhoneCall(phoneNumber) {
      uni.makePhoneCall({
        phoneNumber,
        fail: () => {
          this.showError('拨打电话失败')
        }
      })
    },

    // 预览图片
    previewImage(urls, current = 0) {
      uni.previewImage({
        urls,
        current: typeof current === 'number' ? urls[current] : current,
        fail: () => {
          this.showError('预览图片失败')
        }
      })
    },

    // 选择图片
    chooseImage(count = 1, sizeType = ['compressed'], sourceType = ['album', 'camera']) {
      return new Promise((resolve, reject) => {
        uni.chooseImage({
          count,
          sizeType,
          sourceType,
          success: (res) => {
            resolve(res.tempFilePaths)
          },
          fail: (error) => {
            reject(error)
          }
        })
      })
    },

    // 上传文件
    async uploadFile(filePath, name = 'file', formData = {}) {
      try {
        const res = await uni.uploadFile({
          url: this.$config.uploadUrl,
          filePath,
          name,
          formData,
          header: {
            'Authorization': `Bearer ${auth.getToken()}`
          }
        })
        
        const data = JSON.parse(res.data)
        if (data.code === 200) {
          return data.data
        } else {
          throw new Error(data.message || '上传失败')
        }
      } catch (error) {
        console.error('文件上传失败：', error)
        throw error
      }
    },

    // 获取位置信息
    getLocation() {
      return new Promise((resolve, reject) => {
        uni.getLocation({
          type: 'gcj02',
          success: (res) => {
            resolve({
              latitude: res.latitude,
              longitude: res.longitude,
              address: res.address
            })
          },
          fail: (error) => {
            reject(error)
          }
        })
      })
    },

    // 扫码
    scanCode() {
      return new Promise((resolve, reject) => {
        uni.scanCode({
          success: (res) => {
            resolve(res.result)
          },
          fail: (error) => {
            reject(error)
          }
        })
      })
    },

    // 分享
    onShareAppMessage() {
      return {
        title: this.shareTitle || '智慧畜牧管理系统',
        path: this.sharePath || '/pages/index/index',
        imageUrl: this.shareImage || '/static/images/share-default.jpg'
      }
    },

    // 分享到朋友圈
    onShareTimeline() {
      return {
        title: this.shareTitle || '智慧畜牧管理系统',
        query: this.shareQuery || '',
        imageUrl: this.shareImage || '/static/images/share-default.jpg'
      }
    }
  }
}