import { http } from './config';
import Big from 'big.js';
import dayjs from 'dayjs';

export const formatTime = (date: Date) => {
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  const hour = date.getHours();
  const minute = date.getMinutes();
  const second = date.getSeconds();

  return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second]
    .map(formatNumber)
    .join(':')}`;
};

export const formatNumber = (n: number | string) => {
  n = n.toString();
  return n[1] ? n : `0${n}`;
};

// 对话框
export const showModal = (option: { title?: string; content: string }) => {
  return new Promise<void>((resolve, reject) => {
    wx.showModal({
      title: option.title || '系统提示',
      content: option.content,
      success(res) {
        if (res.confirm) {
          resolve();
        } else if (res.cancel) {
          reject();
        }
      },
    });
  });
};

/** 判断数据是不是数组类型 */
export const isArray = (data: any) => data && Array.isArray(data);

/**
 * 转成数组
 * @param {*} data
 * @returns {Array}
 */
export const toArray = (data: any): any[] => (isArray(data) ? data : []);

/** 判断数据是不是对象类型 */
export const isObject = (data: any) => {
  return data && `${Object.prototype.toString.call(data)}`.includes('Object');
};

export const toObject = (data: any) => (isObject(data) ? data : {});

export const getCurrentPage = () => {
  let pages = getCurrentPages(); //获取加载的页面
  return pages[pages.length - 1];
};

export const reloadPage = () => {
  let url = getCurrentPage().route; //当前页面url
  // 关闭当前页面，跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
  wx.redirectTo({ url: '/' + url });
};

/** 判断是json数据 */
export const isJson = (str: any) => {
  if (str && typeof str == 'string') {
    try {
      const obj = JSON.parse(str);
      return obj && typeof obj == 'object';
    } catch (_e) {
      //
    }
  }
  return false;
};

/**
 * 解码json数据
 * @param data 数据
 * @returns array | object | null
 */
export const jsonParse = (data: any): any[] | object | null => {
  if (data) {
    if (typeof data == 'string') {
      try {
        const obj = JSON.parse(data);
        if (['Array', 'Object'].includes(Object.prototype.toString.call(obj).slice(8, -1))) {
          return obj;
        }
      } catch (e) {
        //
      }
    } else if (['Array', 'Object'].includes(Object.prototype.toString.call(data).slice(8, -1))) {
      return data;
    }
  }
  return null;
};

/**
 * 判断是数字
 * @param {*} value
 * @returns Boolean
 */
export const isNumber = (value: any) => {
  return !isNaN(parseFloat(value)) && isFinite(value);
};

/**
 * 转成数字
 * @param {*} str
 * @returns Number
 */
export const toNumber = (str: any) => {
  return isNumber(str) ? Number(str) : 0;
};

/**
 * 保留小数
 * @param {*} str 文本
 * @param {*} num 位数
 */
export const formatToDecimals = (str: any, num: number = 2) => {
  num = num === undefined ? 2 : toNumber(num);
  return toNumber(str).toFixed(num);
};

/** 获取权限 */
export const getAuthInfo = () => toObject(wx.getStorageSync('auth_info'));

export const goIndexPage = () => {
  wx.navigateTo({ url: '/pages/index/index' });
};

export const isImageFile = (path: string) => {
  return /\.(jpe?g|png|gif|svg|webp|bmp)$/i.test(path);
};

export const isPDFFile = (path: string) => {
  return /\.(pdf)$/i.test(path);
};

/** 判断是不是Excel */
export const isExcelFile = (path: string) => {
  return /\.(xlsx|xls)$/i.test(path);
};

/** 获取文件类型 */
export const getFileType = (path: string): 'file' | 'image' | 'excel' | 'pdf' => {
  if (typeof path == 'string') {
    if (isExcelFile(path)) {
      return 'excel';
    } else if (isImageFile(path)) {
      return 'image';
    } else if (isPDFFile(path)) {
      return 'pdf';
    }
  }
  return 'file';
};

/** 滚动到顶部 */
export const scrollToTop = () => {
  wx.pageScrollTo({ scrollTop: 0 });
};

/** 设置tabs配置 */
export const tabsConfigSet = (key: string, value: any) => {
  const tabsConfig = toObject(tabsConfigGet());
  tabsConfig[key] = value;
  setStorage('tabsConfig', tabsConfig);
};

/** 获取tabs配置 */
export const tabsConfigGet = () => {
  return getStorage('tabsConfig');
};

/**
 * 媒体图片预览
 * @param {*} imageUrls 图片地址数据
 * @param {*} currentUrl 当前数据地址
 */
export const mediaPreview = (imageUrls: any[], currentUrl: string) => {
  console.log('媒体图片预览方法');
  const lastLen =
    `${currentUrl}`.indexOf('?') > -1 ? `${currentUrl}`.indexOf('?') : `${currentUrl}`.length;

  const suffix: any = currentUrl
    .substring(currentUrl.lastIndexOf('.') + 1, lastLen)
    .toLocaleLowerCase();

  if (isImageFile('.' + suffix)) {
    wx.previewImage({ urls: imageUrls, current: currentUrl, showmenu: true });
  } else if (['mp3', 'mp4', 'm4a'].includes(suffix)) {
    wx.previewMedia({
      sources: [{ url: currentUrl, type: 'video' }],
      fail() {
        wx.showToast({ title: '播放失败' });
      },
    });
  } else if (['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'].includes(suffix)) {
    const downloadTask = wx.downloadFile({
      url: currentUrl,
      header: http.header,
      success: (res) => {
        const filePath = res.tempFilePath;
        wx.openDocument({
          filePath: filePath,
          showMenu: true,
          fileType: suffix,
          success: () => {},
        });
      },
      fail() {},
      complete() {
        wx.hideLoading();
      },
    });
    downloadTask.onProgressUpdate((res) => {
      wx.showLoading({
        title: `${res.progress}%`,
      });
      if (res.progress == 100) {
        wx.hideLoading();
      }
    });
  } else {
    wx.showToast({ title: '请前往网页端下载查看' });
  }
};

/**
 * 文件上传封装
 * @param {*} option {filePath: '文件路径', name: 'files', url:'上传url',formData: {额外data},success: (data)=>{}, complete:()=>{},fail: ()=>{} }
 */
export const uploadFile2 = (option: any) => {
  console.log('文件上传封装');
  option = toObject(option);
  option.name = option.name || 'files';

  wx.showLoading({ title: '文件上传中...' });
  wx.uploadFile({
    filePath: option.filePath,
    name: option.name,
    header: {
      ...http.header,
      cookie: 'FREESESSID=' + wx.getStorageSync('session_id'),
    },
    formData: option.formData,
    url: option.url,
    success(res) {
      const resData = jsonParse(res.data);
      wx.showToast({ title: '上传成功' });
      if (option.success) {
        option.success(resData);
      }
    },
    fail() {
      wx.showToast({ title: '上传失败' });
      if (option.fail) {
        option.fail();
      }
    },
    complete() {
      wx.hideLoading();
      if (option.complete) {
        option.complete();
      }
    },
  });
};

/**
 * 获取dataset
 * @param {*} e
 */
export const getDataSet = (e: any) => {
  return e.currentTarget.dataset;
};

export const toastSuccess = (title: string) => {
  wx.showToast({ title: `${title}`, icon: 'success' });
};

export const toastError = (title: string) => {
  wx.showToast({ title: `${title}`, icon: 'error' });
};

export const toastSuccessNotIcon = (title: string) => {
  wx.showToast({ title: `${title}`, icon: 'none' });
};

export const getEnvVersion = wx.getAccountInfoSync().miniProgram.envVersion;

/**
 * 获取缓存数据根据小程序版本
 * @param key string
 */
export const getStorage = (key: string) => {
  // return wx.getStorageSync(`${getEnvVersion}_${key}`);
  return wx.getStorageSync(key);
};

/**
 * 设置缓存数据根据小程序版本
 * @param key string
 * @param data any
 */
export const setStorage = (key: string, data: any) => {
  // return wx.setStorageSync(`${getEnvVersion}_${key}`, data);
  return wx.setStorageSync(key, data);
};

/**
 * 移除缓存数据根据小程序版本
 * @param key string
 */
export const removeStorage = (key: string) => {
  // return wx.removeStorageSync(`${getEnvVersion}_${key}`);
  return wx.removeStorageSync(key);
};

/**
 * 获取当前页面路由
 */
export const getCurrentPageRoute = () => {
  return `/${getCurrentPage().route}`; // 获取当前页面路径
};

/** 价格保留位数 */
export const priceRetentionDigits = (value?: number) => {
  return toNumber(
    Big(toNumber(value)).toFixed(toNumber(wx.getStorageSync('PRICE_HOLD_POINT') || 2)),
  );
};

/** 价格保留位数字符串类型 */
export const priceRetentionDigitsString = (value?: number) => {
  return Big(toNumber(value)).toFixed(toNumber(wx.getStorageSync('PRICE_HOLD_POINT') || 2));
};

/** 数量保留位数 */
export const numRetentionDigits = (value?: number) => {
  return toNumber(
    Big(toNumber(value)).toFixed(toNumber(wx.getStorageSync('NUMS_HOLD_POINT') || 2)),
  );
};

/** 数量保留位数字符串类型 */
export const numRetentionDigitsString = (value?: number) => {
  return Big(toNumber(value)).toFixed(toNumber(wx.getStorageSync('NUMS_HOLD_POINT') || 2));
};

/**
 * sleep
 */
export const sleep = (callback?: () => void, ms = 300): Promise<boolean> => {
  return new Promise((resolve) => {
    setTimeout(() => {
      callback?.();
      resolve(true);
    }, ms);
  });
};

export const searchValueFormat = (value: any) =>
  isArray(value) || isObject(value) ? value : `${value || ''}`.trim();

export const cloneLite = (data: any) => JSON.parse(JSON.stringify(data));

/** 转换文件大小 */
export const formatFileSize = (fileSize: any): string => {
  const file_size = toNumber(fileSize);
  if (file_size == 0) {
    return '0B';
  }
  const unitArr = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  let index = 0;
  index = Math.floor(Math.log(file_size) / Math.log(1024));
  const size = file_size / 1024 ** index;
  return size.toFixed(0) + unitArr[index];
};

export const getDay = (option?: { value: number; unit: 'day' | 'month' | 'year' }) => {
  const { value = 0, unit = 'day' } = option || {};
  return dayjs().subtract(value, unit).format('YYYY-MM-DD');
};

/**
 * 监听向微信后台请求检查更新结果事件
 */
export const updateVersion = () => {
  const updateManager = wx.getUpdateManager();
  // 监听向微信后台请求检查更新结果事件
  updateManager.onCheckForUpdate((res) => {
    if (res.hasUpdate) {
      // 监听小程序有版本更新事件
      updateManager.onUpdateReady(() => {
        wx.showModal({
          title: '更新提示',
          content: '新版本已经准备好，是否重启当前应用？',
          success(res) {
            if (res.confirm) {
              // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
              updateManager.applyUpdate();
            }
          },
        });
      });

      // 监听小程序更新失败事件
      updateManager.onUpdateFailed(function () {
        wx.showModal({ title: '发现新版本', content: '请删除当前小程序，重新搜索打开...' });
      });
    }
  });
};
