// 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<css.Message> 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 = <css.Message>[];

  // 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));
  }
}
