'use strict';

const path = require('path');

const utils = require('loader-utils');

const matchModuleImport = /^~([^/]+|@[^/]+[/][^/]+)$/;

/**
 * When libsass tries to resolve an import, it uses a special algorithm.
 * Since the sass-loader uses webpack to resolve the modules, we need to simulate that algorithm. This function
 * returns an array of import paths to try. The last entry in the array is always the original url
 * to enable straight-forward webpack.config aliases.
 *
 * @param {string} url
 * @returns {Array<string>}
 */
function importsToResolve(url) {
  const request = utils.urlToRequest(url);
  // Keep in mind: ext can also be something like '.datepicker' when the true extension is omitted and the filename contains a dot.
  // @see https://github.com/webpack-contrib/sass-loader/issues/167
  const ext = path.extname(request);

  if (matchModuleImport.test(url)) {
    return [request, url];
  }

  // libsass' import algorithm works like this:

  // In case there is a file extension...
  //   - If the file is a CSS-file, do not include it all, but just link it via @import url().
  //   - The exact file name must match (no auto-resolving of '_'-modules).
  if (ext === '.css') {
    return [];
  }
  if (ext === '.scss' || ext === '.sass') {
    return [request, url];
  }

  // In case there is no file extension...
  //   - Prefer modules starting with '_'.
  //   - File extension precedence: .scss, .sass, .css.
  const basename = path.basename(request);

  if (basename.charAt(0) === '_') {
    return [`${request}.scss`, `${request}.sass`, `${request}.css`, url];
  }

  const dirname = path.dirname(request);

  return [
    `${dirname}/_${basename}.scss`,
    `${dirname}/_${basename}.sass`,
    `${dirname}/_${basename}.css`,
    `${request}.scss`,
    `${request}.sass`,
    `${request}.css`,
    url,
  ];
}

module.exports = importsToResolve;