import { BaseRequest } from '../base/base-request';

import type { IBaseRequestOptions } from '../types';


/**
 * 预处理，与H5端统一数据格式
 * @param param 网络返回的数据
 */
function transferData(param: any) {
  if (param) {
    let data = param?.data || '{}';
    // dataType为'text'，一般情况下返回的 res.data 是JSON字符串，需要解析 res.data 为 JSON 对象
    // 但不排除特殊情况，所以需要 try/catch 处理
    try {
      data = JSON.parse(data);
      param.data = data;
    } catch (e) {
    }
  }
  return param;
}

/**
 * 小程序Post请求发送类
 */
export class MpRequest extends BaseRequest {
  constructor(options: IBaseRequestOptions) {
    super(options);
  }

  doSend(param: any): Promise<any> {
    // 解决京东小程序真机调试返回非Promise的情况
    return new Promise((resolve) => {
      const params = {
        url: param.url,
        dataType: param.dataType || 'text',
        header: param.header,
        method: param.method ? param.method : 'POST',
        data: param.reqData,
        success(res: any) {
          if (res.statusCode >= 200 && res.statusCode < 300) {
            const data = transferData(res);
            resolve(data);
          } else {
            // 异常错误
            res.data = {
              r: res.statusCode,
            };
            const data = transferData(res);
            resolve(data);
          }
        },
        fail(err: any) {
          // 一般小程序遇到接口失败（如502）时，没办法走到这里，会走到success
          const data = transferData(err);
          resolve(data);
        },
      };

      uni.request(params);
    });
  }
}
