/**
 * 医生端微信绑定辅助方法
 * 供 wx-bind-entry 与内容安全自动绑定复用，避免重复 uni.login + bind 逻辑
 */
import { bindDoctorWxWechat } from '@/api/doctorAuth.js';

/**
 * 调用 uni.login 获取微信 code
 * @returns {Promise<string>}
 */
function getWxLoginCode() {
  return new Promise((resolve, reject) => {
    // #ifdef MP-WEIXIN
    uni.login({
      provider: 'weixin',
      success: (loginRes) => {
        if (!loginRes.code) {
          reject({ msg: '获取微信授权失败' });
          return;
        }
        resolve(loginRes.code);
      },
      fail: () => reject({ msg: '微信授权失败' }),
    });
    // #endif
    // #ifndef MP-WEIXIN
    reject({ msg: '请在微信小程序中使用' });
    // #endif
  });
}

/**
 * 确保当前医生账号已绑定微信 openid（内容安全等接口依赖）
 * @param {Object} options
 * @param {boolean} options.showLoading 是否展示 loading，组件内已有 loading 时可传 false
 * @returns {Promise<boolean>} 绑定成功返回 true
 */
export async function ensureDoctorWxBound(options = {}) {
  const { showLoading = true } = options;
  if (showLoading) {
    uni.showLoading({ title: '绑定中...', mask: true });
  }
  try {
    const code = await getWxLoginCode();
    const { ok, res } = await bindDoctorWxWechat(code);
    if (!ok) {
      throw {
        msg: (res && (res.message || res.msg)) || '绑定失败，请前往「我的 → 绑定微信」手动绑定',
      };
    }
    return true;
  } finally {
    if (showLoading) {
      uni.hideLoading();
    }
  }
}

/**
 * 弹出确认框，用户同意后再绑定微信（内容安全等被动触发场景使用）
 * @param {Object} options
 * @param {string} options.title 弹窗标题
 * @param {string} options.content 弹窗正文
 * @param {boolean} options.showLoading 绑定过程是否展示 loading
 * @returns {Promise<boolean>} 绑定成功返回 true，用户取消返回 false
 */
export function promptDoctorWxBind(options = {}) {
  const {
    title = '提示',
    content = '内容安全校验需要绑定微信，是否立即绑定？',
    showLoading = true,
  } = options;
  return new Promise((resolve, reject) => {
    uni.showModal({
      title,
      content,
      confirmText: '去绑定',
      cancelText: '取消',
      success: async (res) => {
        if (!res.confirm) {
          resolve(false);
          return;
        }
        try {
          await ensureDoctorWxBound({ showLoading });
          resolve(true);
        } catch (e) {
          reject(e);
        }
      },
      fail: () => resolve(false),
    });
  });
}
