let webpack = require('webpack');
let path = require('path');

class Api {
    /**
     * Enable sourcemap support.
     *
     * @param {Boolean} generateForProduction
     * @param {string}  devType
     * @param {string}  productionType
     */
    sourceMaps(
        generateForProduction = true,
        devType = 'eval-source-map',
        productionType = 'source-map'
    ) {
        let type = devType;

        if (Mix.inProduction()) {
            type = generateForProduction ? productionType : false;
        }

        Config.sourcemaps = type;

        return this;
    }

    /**
     * Override the default path to your project's public directory.
     *
     * @param {string} defaultPath
     */
    setPublicPath(defaultPath) {
        Config.publicPath = path.normalize(defaultPath.replace(/\/$/, ''));

        return this;
    }

    /**
     * Set a prefix for all generated asset paths.
     *
     * @param {string} path
     */
    setResourceRoot(path) {
        Config.resourceRoot = path;

        return this;
    }

    /**
     * Merge custom config with the provided webpack.config file.
     *
     * @param {object} config
     */
    webpackConfig(config) {
        config = typeof config == 'function' ? config(webpack) : config;

        Config.webpackConfig = require('webpack-merge').smart(
            Config.webpackConfig,
            config
        );

        return this;
    }

    /**
     * Merge custom Babel config with Mix's default.
     *
     * @param {object} config
     */
    babelConfig(config) {
        Config.babelConfig = config;

        return this;
    }

    /**
     * Set Mix-specific options.
     *
     * @param {object} options
     */
    options(options) {
        Config.merge(options);

        return this;
    }

    /**
     * Register a Webpack build event handler.
     *
     * @param {Function} callback
     */
    then(callback) {
        Mix.listen('build', callback);

        return this;
    }

    /**
     * Register an event listen for when the webpack
     * config object has been fully generated.
     *
     * @param {Function} callback
     */
    override(callback) {
        Mix.listen('configReadyForUser', callback);

        return this;
    }

    /**
     * Helper for determining a production environment.
     */
    inProduction() {
        return Mix.inProduction();
    }

    /**
     * Helper to allow for fluent, conditional configuration.
     */
    when(condition, callback) {
        if (condition) {
            callback(this);
        }

        return this;
    }
}

module.exports = Api;
