/**
 * 小程序原生拉起支付（P1）
 * ========================
 * 优先尝试微信原生 wx.requestPayment()；
 * 微信支付未配置/模拟模式/无 openid 时优雅回退 H5 webview。
 */
const api = require('./api');

function getOpenid() {
  const u = wx.getStorageSync('userInfo') || {};
  return u.openid || '';
}

function openH5(path) {
  const base = (getApp() && getApp().globalData && getApp().globalData.baseUrl) || 'https://ssypco.com';
  wx.navigateTo({ url: '/pages/webview/webview?url=' + encodeURIComponent(base + path) });
}

/**
 * 尝试原生支付
 * @param {object} opts { order_no, amount, subject }
 * @returns {Promise<{mode:string, completed?:boolean}>}
 *   mode=jsapi  -> 已调 wx.requestPayment，completed 表示是否支付成功
 *   mode=webview -> 已跳 H5（调用方无需再处理）
 */
function nativePay(opts) {
  return new Promise((resolve, reject) => {
    const openid = getOpenid();
    wx.showLoading({ title: '发起支付...', mask: true });
    api.miniappPay({
      order_no: opts.order_no,
      amount: opts.amount,
      subject: opts.subject || '',
      openid
    }).then((res) => {
      wx.hideLoading();
      const mode = res && res.mode;
      if (mode === 'jsapi' && res.params) {
        // 原生拉起微信支付
        wx.requestPayment({
          ...res.params,
          success: () => resolve({ mode: 'jsapi', completed: true }),
          fail: (e) => resolve({ mode: 'jsapi', completed: false, error: e }),
          complete: () => {}
        });
      } else if (mode === 'simulate' && res.pay_url) {
        // 模拟支付：跳 H5 mock（保持与现有一致，保证可验收）
        openH5(res.pay_url);
        resolve({ mode: 'simulate', pay_url: res.pay_url });
      } else if (res.pay_url) {
        openH5(res.pay_url);
        resolve({ mode: 'h5', pay_url: res.pay_url });
      } else {
        // 无可用支付方式
        wx.showToast({ title: (res && res.message) || '支付方式不可用', icon: 'none', duration: 2500 });
        reject(new Error((res && res.message) || 'no_pay_method'));
      }
    }).catch((err) => {
      wx.hideLoading();
      const msg = (err && err.message) || '支付失败';
      wx.showToast({ title: msg, icon: 'none', duration: 2500 });
      reject(err);
    });
  });
}

module.exports = { nativePay, openH5, getOpenid };
