import type { IApiResponse } from '../types';
import { t } from '@/utils/i18n'

/**
 * 响应拦截器：严格兼容原项目返回约定
 *
 * 原项目要点回顾：
 * - 当 response.statusCode == 200 且 (body.success === true || body.code == 0) 时判定为成功；
 * - 部分错误码（"401", 1000,1001,1100,402 等）表示需要重新登录/清除状态并跳转；
 * - 错误时会返回 Promise.reject({ statusCode: 0, errMsg: ... , data: body })
 *
 */

function handleAuthExpired() {
  // 清空本地登录信息
  try {
    uni.removeStorageSync('userInfo');
  } catch (e) {}
  // 跳转 login，与原项目保持一致的路径
  uni.showToast({ title: t('global.loginExpired'), icon: 'none' });
  setTimeout(() => {
    uni.reLaunch({ url: '/pages/login/login' });
  }, 600);
}

export function responseInterceptor(res: UniApp.RequestSuccessCallbackResult) {
  // 先处理非 200 的 http 状态
  if (res.statusCode && res.statusCode !== 200) {
    const msg = `${t('global.networkConnectionError')} (${res.statusCode})`;
    setTimeout(() => {
      uni.showToast({ title: msg, icon: 'none' });
    }, 10);
    return Promise.reject({ statusCode: res.statusCode, errMsg: msg, response: res });
  }

  // 可能为字符串，尝试解析（原项目也做了类似处理）
  let httpData: IApiResponse | string = res.data;
  if (typeof httpData === 'string') {
    try {
      httpData = JSON.parse(httpData);
    } catch (e) {
      // 无法解析仍然返回原始 body
    }
  }

  // 规范化 message 字段
  const message = (httpData as IApiResponse).msg || (httpData as IApiResponse).message || (httpData as IApiResponse).errMsg || '';

  const code = (httpData as IApiResponse).code;

  // 成功判断
  const successFlag = (httpData as IApiResponse).success === true || code === 0;

  if (successFlag) {
    // 返回原始 httpData
    // 实际数据每个接口不同，调用者需根据实际情况取 .data 字段
    return Promise.resolve(httpData);
  }

  // 登录失效或需要强制登录的一些 code
  if (code === '401' || code === 401) {
    // 触发登出流程
    handleAuthExpired();
    return Promise.reject({ statusCode: 0, errMsg: t('global.loginExpired'), data: httpData });
  }

  // 原项目还将 1000,1001,1100,402 等视作需要强制登录
  if (code == 1000 || code == 1001 || code === 1100 || code === 402) {
    handleAuthExpired();
    return Promise.reject({ statusCode: 0, errMsg: message || t('global.loginExpired'), data: httpData });
  }

  // 其他后端业务错误：toast 并 reject
  const errMsg = message || t('global.requestException');
  if (errMsg) {
    uni.showToast({ title: errMsg, icon: 'none' });
  }

  return Promise.reject({ statusCode: 0, errMsg, data: httpData });
}
