import { DOCS } from '../../../constants'

const buildUrl = (fnName: string): string => {
  if (fnName) {
    let obj
    let fn
    if (fnName.indexOf('.') > 0) {
      [obj, fn] = fnName.split('.')
      fn = `.${fn}`
    } else {
      [obj, fn] = fnName.split('#')
    }
    return `${DOCS}/${obj}.html#${fn}`
  }
  return DOCS
}

/**
 * Error which is thrown when an abstract method is not implemented
 *
 * @category Errors
 */
export class NotImplementedError extends Error {
  /**
   * @param   {string}  fnName  name of the function, base on which error will
   * print on the output link to the method documentation.
   */
  constructor(fnName: string) {
    const message = `
    You have to implement the method: ${fnName}
    Check out the documentation at: ${buildUrl(fnName)}
    `
    super(message)
    this.message = message
  }
}

export default NotImplementedError
