var path = require('path');
var loaderUtils = require('loader-utils');

module.exports = function(content) {
    this.cacheable && this.cacheable();
    if(!this.emitFile) throw new Error('emitFile is required from module system');

    var query = loaderUtils.getOptions(this) || {};
    var configKey = query.config || 'multiFileLoader';
    var options = this.options[configKey] || {};
    var config = {
        publicPath: false,
        useRelativePath: false,
        name: '[hash].[ext]'
    };

    // options takes precedence over config
    Object.keys(options).forEach(function(attr) {
        config[attr] = options[attr];
    });

    // query takes precedence over config and options
    Object.keys(query).forEach(function(attr) {
        config[attr] = query[attr];
    });

    var context = config.context || this.options.context;
    var url = loaderUtils.interpolateName(this, config.name, {
        context: context,
        content: content,
        regExp: config.regExp
    });
    var path = loaderUtils.interpolateName(this, '[path]', {
        context: context,
        content: content,
        regExp: config.regExp
    });

    var outputPath = '';

    if (config.outputPath) {
        outputPath = (
            typeof config.outputPath === 'function'
                ? config.outputPath(url, path)
                : config.outputPath + url
        );
    } else {
        outputPath = url;
    }

    var publicPath = JSON.stringify(url);

    if (config.publicPath) {
        publicPath = JSON.stringify(
            typeof config.publicPath === 'function'
                ? config.publicPath(url, path)
                : config.publicPath + url
        );
    }

    publicPath = '__webpack_public_path__ + ' + publicPath;

    if (query.emitFile === undefined || query.emitFile) {
        this.emitFile(outputPath, content);
    }

    return 'module.exports = ' + publicPath + ';';
};

module.exports.raw = true;