/* eslint-disable no-param-reassign */
import { Method } from 'axios';
import base64Arraybuffer from 'base64-arraybuffer';
import { Headers } from '../../inspirecloud';
import { Response, UploadProgressObject } from '../../types/constant';
import getAdapter from '../../utils/adaptive';

const adapter = getAdapter();

export default class Request {
  async upload(config: {
    headers: Headers;
    path?: string;
    fileName?: string;
    filePath?: string;
    url: string;
    data?: any;
    method: Method;
    onProgressUpdate?: UploadProgressObject
  }, baseURL: string): Promise<{ data: any; }> {
    if (!config.filePath) {
      config.headers['x-tt-base64-encoded'] = 'true';
      config.data = base64Arraybuffer.encode(config.data as ArrayBuffer);
      return new Promise((resolve, reject) => {
        adapter.request({
          ...(config),
          header: config.headers,
          success(res: Response) {
            resolve(res);
          },
          fail(e: any) {
            reject(e);
          }
        });
      });
    }
    return new Promise((resolve, reject) => {
      const upoloadTask = adapter.uploadFile({
        url: baseURL + '/--mgc_file',
        filePath: config.filePath,
        name: 'file',
        header: config.headers,
        success(res: Response) {
          resolve({ data: JSON.parse(res.data as string) });
        },
        fail(e: any) {
          reject(e);
        }
      });
      if (typeof config.onProgressUpdate === 'function') {
        upoloadTask.onProgressUpdate(config.onProgressUpdate);
      }
    });
  }

  async request(options: any): Promise<{ data: any; }> {
    return new Promise((resolve, reject) => {
      adapter.request({
        ...options,
        header: options.headers,
        success(res: Response) {
          resolve(res);
        },
        fail(e: Error) {
          reject(e);
        }
      });
    });
  }
}