/* @flow */
"use strict";
const augmentConfigFull = require("./augmentConfig").augmentConfigFull;
const configurationError = require("./utils/configurationError");
const path = require("path");

/*:: type configPromise = Promise<?{ config: stylelint$config, filepath: string }>*/

module.exports = function(
  stylelint /*: stylelint$internalApi*/,
  searchPath /*:: ?: string*/
) /*: configPromise*/ {
  searchPath = searchPath || process.cwd();

  const optionsConfig = stylelint._options.config;

  if (optionsConfig !== undefined) {
    const cached /*: configPromise*/ = stylelint._specifiedConfigCache.get(
      optionsConfig
    );
    if (cached) return cached;

    // stylelint._fullExplorer (cosmiconfig) is already configured to
    // run augmentConfigFull; but since we're making up the result here,
    // we need to manually run the transform
    const augmentedResult = augmentConfigFull(stylelint, {
      config: optionsConfig,
      // Add the extra path part so that we can get the directory without being
      // confused
      filepath: path.join(process.cwd(), "argument-config")
    });
    stylelint._specifiedConfigCache.set(optionsConfig, augmentedResult);
    return augmentedResult;
  }

  return stylelint._fullExplorer
    .load(searchPath, stylelint._options.configFile)
    .then(config => {
      // If no config was found, try looking from process.cwd
      if (!config) return stylelint._fullExplorer.load(process.cwd());
      return config;
    })
    .then(config => {
      if (!config) {
        const ending = searchPath ? ` for ${searchPath}` : "";
        throw configurationError(`No configuration provided${ending}`);
      }
      return config;
    });
};
