module.exports = function (SourceMapOutput, environment) {

var SourceMapBuilder = function (options) {
    this.options = options;
};

SourceMapBuilder.prototype.toCSS = function(rootNode, options, imports) {
    var sourceMapOutput = new SourceMapOutput(
        {
            contentsIgnoredCharsMap: imports.contentsIgnoredChars,
            rootNode: rootNode,
            contentsMap: imports.contents,
            sourceMapFilename: this.options.sourceMapFilename,
            sourceMapURL: this.options.sourceMapURL,
            outputFilename: this.options.sourceMapOutputFilename,
            sourceMapBasepath: this.options.sourceMapBasepath,
            sourceMapRootpath: this.options.sourceMapRootpath,
            outputSourceFiles: this.options.outputSourceFiles,
            sourceMapGenerator: this.options.sourceMapGenerator,
            sourceMapFileInline: this.options.sourceMapFileInline
        });

    var css = sourceMapOutput.toCSS(options);
    this.sourceMap = sourceMapOutput.sourceMap;
    this.sourceMapURL = sourceMapOutput.sourceMapURL;
    if (this.options.sourceMapInputFilename) {
        this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);
    }
    return css + this.getCSSAppendage();
};

SourceMapBuilder.prototype.getCSSAppendage = function() {

    var sourceMapURL = this.sourceMapURL;
    if (this.options.sourceMapFileInline) {
        if (this.sourceMap === undefined) {
            return "";
        }
        sourceMapURL = "data:application/json;base64," + environment.encodeBase64(this.sourceMap);
    }

    if (sourceMapURL) {
        return "/*# sourceMappingURL=" + sourceMapURL + " */";
    }
    return "";
};

SourceMapBuilder.prototype.getExternalSourceMap = function() {
    return this.sourceMap;
};
SourceMapBuilder.prototype.setExternalSourceMap = function(sourceMap) {
    this.sourceMap = sourceMap;
};

SourceMapBuilder.prototype.isInline = function() {
    return this.options.sourceMapFileInline;
};
SourceMapBuilder.prototype.getSourceMapURL = function() {
    return this.sourceMapURL;
};
SourceMapBuilder.prototype.getOutputFilename = function() {
    return this.options.sourceMapOutputFilename;
};
SourceMapBuilder.prototype.getInputFilename = function() {
    return this.sourceMapInputFilename;
};

return SourceMapBuilder;

};