import { last } from 'lodash';
import { Handler } from '../handler.class';

/**
 * @example ( //user to /user ) or ( /user/ to /user )
 * @param url
 * @return {string}
 */
export function slashValid(url: string): string {
  if (url[0] === '/' && url[1] === '/') url = url.slice(1);

  if (url.length > 1 && last(url) === '/') {
    return url.substring(0, url.length - 1);
  } else {
    return url;
  }
}

/**
 * @example ( /user to user ) or ( user/ to user )
 * @param url
 * @return {string}
 */
export function slashUnwrap(url: string): string {
  return url.replace('/', '');
}

/**
 * @example ( /user to /user/ ) or ( user/ to /user/ )
 * @param url
 * @return {string}
 */
export function slashWrap(url: string): string {
  if (url[0] !== '/' && last(url) === '/') {
    return `/${url}`;
  } else if (url[0] === '/' && last(url) !== '/') {
    return `${url}/`;
  }

  return url;
}

/**
 * @example ( user to /user ) or ( user/ to /user )
 * @param url
 * @return {string}
 */
export function slashAdd(url: string): string {
  let pattern = `/${url}`;

  if (url.indexOf('/') && last(url) === '/') {
    return pattern;
  } else if (url.indexOf('/')) {
    return pattern;
  } else {
    return url;
  }
}

/**
 * @description wait for all components
 * @param description
 * @param callback
 * @param delay
 */
export function wait(description: string, callback: any, delay: number = 0): string {
  setTimeout(() => {
    callback();
  }, delay);

  return description;
}

/**
 * @example "73453021571897729"
 * @return {string}
 */
export function generateId(): string {
  return Math.random().toString().slice(2);
}

/**
 * @description try to require default
 * @param path
 * @return {any}
 */
export function tryDefault(path: string) {
  try {
    return require(path).default;
  } catch(err) {
    Handler.warning(`${path} has no export default. Require without "default" can lead to errors.`);
    return require(path);
  }
}

/**
 * @description drop if not exists "export default"
 * @param path
 * @return {any}
 */
export function dropIfNotDefault(path: string) {
  try {
    return require(path).default;
  } catch(err) {
    Handler.error(`${path} has no "export default".`);
  }
}