/**
 * @fileoverview Tools for obtaining SourceCode objects.
 * @author Ian VanSchooten
 */

"use strict";

//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------

const CLIEngine = require("../cli-engine"),
    globUtil = require("./glob-util"),
    baseDefaultOptions = require("../../conf/default-cli-options");

const debug = require("debug")("eslint:source-code-util");

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

/**
 * Get the SourceCode object for a single file
 * @param   {string}     filename The fully resolved filename to get SourceCode from.
 * @param   {Object}     options  A CLIEngine options object.
 * @returns {Array}               Array of the SourceCode object representing the file
 *                                and fatal error message.
 */
function getSourceCodeOfFile(filename, options) {
    debug("getting sourceCode of", filename);
    const opts = Object.assign({}, options, { rules: {} });
    const cli = new CLIEngine(opts);
    const results = cli.executeOnFiles([filename]);

    if (results && results.results[0] && results.results[0].messages[0] && results.results[0].messages[0].fatal) {
        const msg = results.results[0].messages[0];

        throw new Error(`(${filename}:${msg.line}:${msg.column}) ${msg.message}`);
    }
    const sourceCode = cli.linter.getSourceCode();

    return sourceCode;
}

//------------------------------------------------------------------------------
// Public Interface
//------------------------------------------------------------------------------


/**
 * This callback is used to measure execution status in a progress bar
 * @callback progressCallback
 * @param {number} The total number of times the callback will be called.
 */

/**
 * Gets the SourceCode of a single file, or set of files.
 * @param {string[]|string} patterns A filename, directory name, or glob, or an array of them
 * @param {Object} [providedOptions] A CLIEngine options object. If not provided, the default cli options will be used.
 * @param {progressCallback} [providedCallback] Callback for reporting execution status
 * @returns {Object} The SourceCode of all processed files.
 */
function getSourceCodeOfFiles(patterns, providedOptions, providedCallback) {
    const sourceCodes = {};
    const globPatternsList = typeof patterns === "string" ? [patterns] : patterns;
    let options, callback;

    const defaultOptions = Object.assign({}, baseDefaultOptions, { cwd: process.cwd() });

    if (typeof providedOptions === "undefined") {
        options = defaultOptions;
        callback = null;
    } else if (typeof providedOptions === "function") {
        callback = providedOptions;
        options = defaultOptions;
    } else if (typeof providedOptions === "object") {
        options = Object.assign({}, defaultOptions, providedOptions);
        callback = providedCallback;
    }
    debug("constructed options:", options);
    const resolvedPatterns = globUtil.resolveFileGlobPatterns(globPatternsList, options);

    const filenames = globUtil.listFilesToProcess(resolvedPatterns, options)
        .filter(fileInfo => !fileInfo.ignored)
        .reduce((files, fileInfo) => files.concat(fileInfo.filename), []);

    if (filenames.length === 0) {
        debug(`Did not find any files matching pattern(s): ${resolvedPatterns}`);
    }
    filenames.forEach(filename => {
        const sourceCode = getSourceCodeOfFile(filename, options);

        if (sourceCode) {
            debug("got sourceCode of", filename);
            sourceCodes[filename] = sourceCode;
        }
        if (callback) {
            callback(filenames.length); // eslint-disable-line callback-return
        }
    });
    return sourceCodes;
}

module.exports = {
    getSourceCodeOfFiles
};
