var path = require('path');
var mkdirp = require('mkdirp');
var includePathSearcher = require('include-path-searcher');
var CachingWriter = require('broccoli-caching-writer');
var nodeSass = require('node-sass');
var assign = require('object-assign');
var rsvp = require('rsvp');
var Promise = rsvp.Promise;
var fs = require('fs');
var writeFile = rsvp.denodeify(fs.writeFile);

module.exports = SassCompiler;
SassCompiler.prototype = Object.create(CachingWriter.prototype);
SassCompiler.prototype.constructor = SassCompiler;

function SassCompiler (inputNodes, inputFile, outputFile, options) {
  if (!(this instanceof SassCompiler)) { return new SassCompiler(inputNodes, inputFile, outputFile, options); }
  if (!Array.isArray(inputNodes)) { throw new Error('Expected array for first argument - did you mean [tree] instead of tree?'); }

  CachingWriter.call(this, inputNodes, {
    annotation: options.annotation,
    cacheInclude: options.cacheInclude,
    cacheExclude: options.cacheExclude
  });

  this.inputFile = inputFile;
  this.outputFile = outputFile;
  options = options || {};
  this.options = {
    nodeSass: options.nodeSass
  };

  var sass = this.options.nodeSass || nodeSass;

  this.renderSass = rsvp.denodeify(sass.render);

  this.sassOptions = {
    importer: options.importer,
    functions: options.functions,
    indentedSyntax: options.indentedSyntax,
    omitSourceMapUrl: options.omitSourceMapUrl,
    outputStyle: options.outputStyle,
    precision: options.precision,
    sourceComments: options.sourceComments,
    sourceMap: options.sourceMap,
    sourceMapEmbed: options.sourceMapEmbed,
    sourceMapContents: options.sourceMapContents,
    sourceMapRoot: options.sourceMapRoot
  };
}

SassCompiler.prototype.build = function() {
  var destFile = path.join(this.outputPath, this.outputFile);
  var sourceMapFile = this.sassOptions.sourceMap;

  if (typeof sourceMapFile !== 'string') {
    sourceMapFile = destFile + '.map';
  }

  mkdirp.sync(path.dirname(destFile));

  var sassOptions = {
    file: includePathSearcher.findFileSync(this.inputFile, this.inputPaths),
    includePaths: this.inputPaths,
    outFile: destFile
  };

  assign(sassOptions, this.sassOptions);

  return this.renderSass(sassOptions).then(function(result) {
    var files = [
      writeFile(destFile, result.css)
    ];

    if (this.sassOptions.sourceMap && !this.sassOptions.sourceMapEmbed) {
      files.push(writeFile(sourceMapFile, result.map));
    }

    return Promise.all(files);
  }.bind(this));
};

@@ -1714,16 +1714,515 @@
   %7D;%0A%7D%0A%0A
+/**%0A * Mutates the error to include properties expected by Ember CLI.%0A * See https://github.com/ember-cli/ember-cli/blob/master/docs/ERRORS.md#error-object%0A * @param %7BError%7D error%0A */%0Afunction rethrowBuildError(error) %7B%0A  if (typeof error === 'string') %7B%0A    throw new Error('%5Bstring exception%5D ' + error);%0A  %7D else %7B%0A    error.type = 'Sass Syntax Error';%0A    error.message = error.formatted;%0A    error.location = %7B%0A      line: error.line,%0A      column: error.column%0A    %7D;%0A%0A    throw error;%0A  %7D%0A%7D%0A%0A
 SassComp
@@ -3010,13 +3010,38 @@
 d(this))
+.catch(rethrowBuildError)
 ;%0A%7D;%0A

fix Sass errors for better Ember CLI error messages