/**
 * 登录页面
 * 显示LOGO、应用名称和微信手机号快速登录按钮
 * 用户需勾选同意协议后才能登录
 * 
 * 支持持久化登录：
 * - 登录成功后保存Token到本地（7天有效期）
 * - 再次进入时自动恢复登录状态
 */
const app = getApp()
const auth = require('../../utils/auth')
const api = require('../../utils/api')
const config = require('../../config/index')

Page({
  data: {
    loginLoading: false,
    statusBarHeight: 20,
    agreementChecked: false  // 协议默认不勾选
  },

  onLoad(options) {
    // 保存来源页面，登录成功后跳转
    this.redirectUrl = options.redirect || ''

    // 获取状态栏高度
    const systemInfo = wx.getSystemInfoSync()
    this.setData({
      statusBarHeight: systemInfo.statusBarHeight || 20
    })

    // 检查是否已登录，如果已登录则直接跳转
    this.checkExistingLogin()
  },

  /**
   * 检查现有登录状态
   * 如果已登录且Token有效，直接跳转
   */
  async checkExistingLogin() {
    if (auth.isLoggedIn()) {
      // 验证服务端Token
      const result = await auth.verifyLogin()
      if (result.valid) {
        console.log('已登录，直接跳转')
        this.navigateAfterLogin()
      }
    }
  },

  /**
   * 切换协议勾选状态
   */
  toggleAgreement() {
    this.setData({
      agreementChecked: !this.data.agreementChecked
    })
  },

  /**
   * 未勾选协议时点击登录按钮
   */
  onLoginBtnTap() {
    if (!this.data.agreementChecked) {
      wx.showToast({
        title: '请先同意用户协议和隐私协议',
        icon: 'none',
        duration: 2000
      })
    }
  },

  /**
   * 显示用户服务协议
   */
  showUserAgreement() {
    wx.navigateTo({
      url: '/pages/agreement/agreement?code=user_service'
    })
  },

  /**
   * 显示隐私协议
   */
  showPrivacyPolicy() {
    wx.navigateTo({
      url: '/pages/agreement/agreement?code=privacy_policy'
    })
  },

  /**
   * 微信手机号快速登录
   * @param {object} e - 事件对象
   */
  async onGetPhoneNumber(e) {
    console.log('手机号授权回调', e.detail)

    // 用户取消授权
    if (e.detail.errMsg !== 'getPhoneNumber:ok') {
      wx.showToast({
        title: '您已取消授权',
        icon: 'none',
        duration: 2000
      })
      return
    }

    // 获取手机号授权code
    const phoneCode = e.detail.code
    if (!phoneCode) {
      wx.showModal({
        title: '提示',
        content: '获取授权信息失败，请重试',
        showCancel: false
      })
      return
    }

    // 显示加载状态
    this.setData({ loginLoading: true })
    wx.showLoading({ title: '登录中...', mask: true })

    try {
      // 1. 获取登录code (用于换取openid)
      const loginRes = await new Promise((resolve, reject) => {
        wx.login({
          success: resolve,
          fail: reject
        })
      })

      if (!loginRes.code) {
        throw new Error('获取登录凭证失败')
      }

      // 2. 使用app的wxPhoneLogin方法完成登录 (传递两个code)
      await app.wxPhoneLogin(phoneCode, loginRes.code)

      wx.hideLoading()
      wx.showToast({
        title: '登录成功',
        icon: 'success',
        duration: 1500
      })

      // 登录成功后调用爱心值API（B自己获得+100）
      this.claimLovePointsLoginReward()

      // 延迟跳转，让用户看到成功提示
      setTimeout(() => {
        this.navigateAfterLogin()
      }, 1500)

    } catch (err) {
      console.error('手机号登录失败', err)
      wx.hideLoading()
      this.handleLoginError(err)
    } finally {
      this.setData({ loginLoading: false })
    }
  },

  /**
   * 登录成功后跳转
   */
  navigateAfterLogin() {
    if (this.redirectUrl) {
      // 跳转到来源页面
      wx.redirectTo({
        url: decodeURIComponent(this.redirectUrl),
        fail: () => {
          // 如果是tabBar页面，使用switchTab
          wx.switchTab({
            url: decodeURIComponent(this.redirectUrl).split('?')[0]
          })
        }
      })
    } else {
      // 默认跳转到首页
      wx.switchTab({
        url: '/pages/index/index'
      })
    }
  },

  /**
   * 处理登录错误
   * @param {object} err - 错误对象
   */
  handleLoginError(err) {
    let message = '登录失败，请稍后重试'

    if (err.code === 'PHONE_DECRYPT_FAILED') {
      message = '手机号解密失败，请重试'
    } else if (err.code === 'WX_SESSION_EXPIRED') {
      message = '微信会话已过期，请重新打开小程序'
    } else if (err.message) {
      message = err.message
    }

    wx.showModal({
      title: '登录失败',
      content: message,
      showCancel: false
    })
  },

  /**
   * 返回上一页
   */
  goBack() {
    const pages = getCurrentPages()
    if (pages.length > 1) {
      wx.navigateBack()
    } else {
      wx.switchTab({
        url: '/pages/index/index'
      })
    }
  },

  /**
   * 领取登录爱心值奖励（B自己获得+100）
   * 后端会同时检查是否有邀请人，如果有则给邀请人也+100
   */
  async claimLovePointsLoginReward() {
    try {
      const res = await api.lovePoints.login()
      if (res.success && res.data && res.data.earned > 0) {
        console.log('[login] 登录爱心值奖励:', res.data.earned)
      }
    } catch (err) {
      console.error('[login] 领取登录爱心值失败:', err)
    }
  }
})
