// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var through2 = require('through2');
var path = require('path');
var rework = require('rework');
var reworkVars = require('rework-vars');
var reworkImport = require('rework-import');

module.exports = {
  canTransform: isCss,
  transform: transform
};

/*
 * Transform the given css file by compiling it with rework.
 */
function transform(file) {
  var contents = [];

  return through2(write, flush);

  // Simply collect string fragments of the css file.
  function write(data, encoding, callback) {
    var string = data.toString();
    contents.push(string);
    callback();
  }

  // Reconstruct the css and then compile it.
  function flush(callback) {
    var string = contents.join('');
    var css = compile(string);
    this.push('module.exports = ' + JSON.stringify(css));
    callback();
  }
}

/* Compiles the given CSS string using rework. */
function compile(string) {
  var css = rework(string)
    .use(reworkImport({
      path: 'src/components'
    }))
    .use(reworkVars())
    .toString({
      compress: true
    });
  return css;
}

/* Determines if the filetype is css. */
function isCss(file) {
  return path.extname(file) === '.css';
}