import Cookies from 'js-cookie';
import pathRegexp from 'path-to-regexp';
import { parse } from 'querystring';

import pkg from '../../package.json';

const { toString } = Object.prototype;
/* eslint no-useless-escape:0 import/prefer-default-export:0 */
const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;

export const isUrl = path => reg.test(path);

export const getPageQuery = () => parse(window.location.href.split('?')[1]);

export const getAuthorityFromRouter = (router, pathname) => {
  const authority = router.find(
    ({ routes, path = '/', target = '_self' }) =>
      (path && target !== '_blank' && pathRegexp(path).exec(pathname)) ||
      (routes && getAuthorityFromRouter(routes, pathname)),
  );
  if (authority) return authority;
  return undefined;
};

export const getRouteAuthority = (path, routeData) => {
  let authorities;
  routeData.forEach(route => {
    if (pathRegexp(`${route.path}/(.*)`).test(`${path}/`)) {
      if (route.authority) {
        authorities = route.authority;
      }
      if (route.path === path) {
        authorities = route.authority || authorities;
      }

      if (route.routes) {
        authorities = getRouteAuthority(path, route.routes) || authorities;
      }
    }
  });
  return authorities;
};

export function isPromise(obj) {
  return (
    !!obj && // 有实际含义的变量才执行方法,变量null,undefined和''空串都为false
    (typeof obj === 'object' || typeof obj === 'function') && // 初始promise 或 promise.then返回的
    typeof obj.then === 'function'
  );
}

export function getBaseName() {
  return pkg.name.toLocaleLowerCase();
}
let cache = {};
export function findPathByLeafId(leafId, nodes, path, key, clear) {
  if (path === undefined) {
    path = {};
  }
  let tmpPath = path;
  if(clear) {
    cache = {};
  }
  if (cache[leafId]) {
    return cache[leafId];
  }
  // eslint-disable-next-line no-plusplus
  for (let i = 0; i < nodes.length; i++) {
    if (nodes[i] && nodes[i][key] && leafId === nodes[i][key]) {
      tmpPath = nodes[i];
      cache[leafId] = tmpPath;
      return tmpPath;
    }
    if (nodes[i] && nodes[i].routes) {
      const findResult = findPathByLeafId(
        leafId,
        nodes[i].routes,
        tmpPath,
        key,
      );
      if (findResult) {
        cache[leafId] = findResult;
        return findResult;
      }
    }
  }
}

export function transformURL(path) {
  //civweb4/
  // path = path.replace(/[(\\|)|(&)]widget=[0-9]*/, '');
  const el = document.createElement('input');
  el.value = path;
  String.fromCharCode(92);
  return el.value.replace(/\\/g, '/');
}

export function findPathByWidget(leafId, nodes, path, key) {
  if (path === undefined) {
    path = {};
  }
  let tmpPath = path;
  // eslint-disable-next-line no-plusplus
  for (let i = 0; i < nodes.length; i++) {
    if (nodes[i] && nodes[i][key] && nodes[i][key].indexOf(leafId) > -1) {
      tmpPath = nodes[i];
      return tmpPath;
    }
    if (nodes[i] && nodes[i].widgets) {
      const findResult = findPathByWidget(
        leafId,
        nodes[i].widgets,
        tmpPath,
        key,
        // eslint-disable-next-line no-restricted-globals
        location,
      );
      if (findResult) {
        return findResult;
      }
    }
  }
  return tmpPath;
}

export function isJSON(str) {
  if (typeof str === 'string') {
    try {
      const obj = JSON.parse(str);
      if (typeof obj === 'object' && obj) {
        return true;
      }
      return false;
    } catch (e) {
      return false;
    }
  }
}

export function isString(str) {
  return toString.call(str) === '[object String]';
}

export const getKeyName = path => {
  const truePath = path.split('?')[0];
  const curRoute = [].filter(item => item.path.includes(truePath));

  if (!curRoute[0]) {
    return {
      title: '暂无权限',
      tabKey: '403',
    };
  }
  const { name, key, component } = curRoute[0];
  return { title: name, tabKey: key, component };
};

export const asyncAction = action => {
  const wait = new Promise(resolve => resolve(action));
  return callback => {
    wait.then(() => setTimeout(() => callback()));
  };
};

export function getToken() {
  return Cookies.get('token');
}
export function setToken(token) {
  Cookies.set(token);
}
export const closeTabAction = (history, returnUrl, callback) => {};