// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a

import 'package:csslib/parser.dart' as css;
import 'package:csslib/visitor.dart';

const _default = const css.PreprocessorOptions(
    useColors: false,
    checked: true,
    warningsAsErrors: true,
    inputFile: 'memory');

/**
 * Spin-up CSS parser in checked mode to detect any problematic CSS.  Normally,
 * CSS will allow any property/value pairs regardless of validity; all of our
 * tests (by default) will ensure that the CSS is really valid.
 */
StyleSheet parseCss(String cssInput,
    {List errors, css.PreprocessorOptions opts}) {
  return css.parse(cssInput,
      errors: errors, options: opts == null ? _default : opts);
}

// Pretty printer for CSS.
var emitCss = new CssPrinter();
String prettyPrint(StyleSheet ss) =>
    (emitCss..visitTree(ss, pretty: true)).toString();

main() {
  var errors = [];

  // Parse a simple stylesheet.
  print('1. Good CSS, parsed CSS emitted:');
  print('   =============================');
  var stylesheet = parseCss(
      '@import "support/at-charset-019.css"; div { color: red; }'
      'button[type] { background-color: red; }'
      '.foo { '
      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
      '}'
      '#div {'
      'color : #00F578; border-color: #878787;'
      '}', errors: errors);

  if (!errors.isEmpty) {
    print("Got ${errors.length} errors.\n");
    for (var error in errors) {
      print(error);
    }
  } else {
    print(prettyPrint(stylesheet));
  }

  // Parse a stylesheet with errors
  print('2. Catch severe syntax errors:');
  print('   ===========================');
  var stylesheetError = parseCss('.foo #%^&*asdf{ '
      'color: red; left: 20px; top: 20px; width: 100px; height:200px'
      '}', errors: errors);

  if (!errors.isEmpty) {
    print("Got ${errors.length} errors.\n");
    for (var error in errors) {
      print(error);
    }
  } else {
    print(stylesheetError.toString());
  }

  // Parse a stylesheet that warns (checks) problematic CSS.
  print('3. Detect CSS problem with checking on:');
  print('   ===================================');
  stylesheetError = parseCss('# div1 { color: red; }', errors: errors);

  if (!errors.isEmpty) {
    print("Detected ${errors.length} problem in checked mode.\n");
    for (var error in errors) {
      print(error);
    }
  } else {
    print(stylesheetError.toString());
  }

  // Parse a CSS selector.
  print('4. Parse a selector only:');
  print('   ======================');
  var selectorAst = css.selector('#div .foo', errors: errors);
  if (!errors.isEmpty) {
    print("Got ${errors.length} errors.\n");
    for (var error in errors) {
      print(error);
    }
  } else {
    print(prettyPrint(selectorAst));
  }
}
