var LessError = require('./less-error'),

transformTree = require("./transform-tree"),
logger = require("./logger");

module.exports = function(SourceMapBuilder) {

var ParseTree = function(root, imports) {
    this.root = root;
    this.imports = imports;
};

ParseTree.prototype.toCSS = function(options) {
    var evaldRoot, result = {}, sourceMapBuilder;
    try {
        evaldRoot = transformTree(this.root, options);
    } catch (e) {
        throw new LessError(e, this.imports);
    }

    try {
        var compress = Boolean(options.compress);
        if (compress) {
            logger.warn("The compress option has been deprecated. We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.");
        }

        var toCSSOptions = {
            compress: compress,
            dumpLineNumbers: options.dumpLineNumbers,
            strictUnits: Boolean(options.strictUnits),
            numPrecision: 8};

        if (options.sourceMap) {
            sourceMapBuilder = new SourceMapBuilder(options.sourceMap);
            result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);
        } else {
            result.css = evaldRoot.toCSS(toCSSOptions);
        }
    } catch (e) {
        throw new LessError(e, this.imports);
    }

    if (options.pluginManager) {
        var postProcessors = options.pluginManager.getPostProcessors();
        for (var i = 0; i < postProcessors.length; i++) {
            result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options: options, imports: this.imports });
        }
    }
    if (options.sourceMap) {
        result.map = sourceMapBuilder.getExternalSourceMap();
    }

    result.imports = [];
    for (var file in this.imports.files) {
        if (this.imports.files.hasOwnProperty(file) && file !== this.imports.rootFilename) {
            result.imports.push(file);
        }
    }
    return result;
};
return ParseTree;

};