// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library csstool;

import 'dart:io';
import 'css.dart';
import '../lib/file_system.dart';
import '../lib/file_system_vm.dart';


FileSystem files;

/** Invokes [callback] and returns how long it took to execute in ms. */
num time(callback()) {
  final watch = new Stopwatch();
  watch.start();
  callback();
  watch.stop();
  return watch.elapsedMilliseconds;
}

printStats(num elapsed, [String filename = '']) {
  print('Parsed ${_GREEN_COLOR}${filename}${_NO_COLOR} in ${elapsed} msec.');
}

/**
 * Run from the `utils/css` directory.
 */
void main() {
  var optionArgs = new Options().arguments;
  assert(optionArgs.length == 2);

  String sourceFullFn = optionArgs[0];
  String outputFullFn = optionArgs[1];

  String sourcePath;
  String sourceFilename;
  int idxBeforeFilename = sourceFullFn.lastIndexOf('/');
  if (idxBeforeFilename >= 0) {
    sourcePath = sourceFullFn.substring(0, idxBeforeFilename + 1);
    sourceFilename = sourceFullFn.substring(idxBeforeFilename + 1);
  }

  String outPath;
  idxBeforeFilename = outputFullFn.lastIndexOf('/');
  if (idxBeforeFilename >= 0) {
    outPath = outputFullFn.substring(0, idxBeforeFilename + 1);
  }

  initCssWorld();

  files = new VMFileSystem();
  if (!files.fileExists(sourceFullFn)) {
    // Display colored error message if file is missing.
    print("\033[31mCSS source file missing - ${sourceFullFn}\033[0m");
  } else {
    String source = files.readAll(sourceFullFn);

    Stylesheet stylesheet;

    final elapsed = time(() {
      Parser parser = new Parser(
          new SourceFile(sourceFullFn, source), 0, files, sourcePath);
      stylesheet = parser.parse();
    });

    printStats(elapsed, sourceFullFn);

    StringBuffer buff = new StringBuffer(
      '/* File generated by SCSS from source ${sourceFilename}\n' +
      ' * Do not edit.\n' +
      ' */\n\n');
    buff.write(stylesheet.toString());

    files.writeString(outputFullFn, buff.toString());
    print("Generated file ${outputFullFn}");

    // Generate CSS.dart file.
    String genDartClassFile = Generate.dartClass(files, outPath, stylesheet,
        sourceFilename);
    print("Generated file ${genDartClassFile}");
  }
}
