// 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
// BSD-style license that can be found in the LICENSE file.

/** General options used by the compiler. */
TemplateOptions options;

/** Extracts options from command-line arguments. */
void parseOptions(List<String> args, var files) {
  assert(options == null);
  options = new TemplateOptions(args, files);
}

class TemplateOptions {
  /** Location of corelib and other special dart libraries. */
  String libDir;

  /* The top-level dart script to compile. */
  String dartScript;

  /** Where to place the generated code. */
  String outfile;

  // Options that modify behavior significantly

  bool warningsAsErrors = false;
  bool checkOnly = false;

  // Message support
  bool throwOnErrors = false;
  bool throwOnWarnings = false;
  bool throwOnFatal = false;
  bool showInfo = false;
  bool showWarnings = true;
  bool useColors = true;

  /**
   * Options to be used later for passing to the generated code. These are all
   * the arguments after the first dart script, if any.
   */
  List<String> childArgs;

  TemplateOptions(List<String> args, var files) {
    bool ignoreUnrecognizedFlags = false;
    bool passedLibDir = false;
    childArgs = [];

    // Start from 2 to skip arguments representing the compiler command
    // (python followed by frog.py).
    loop: for (int i = 2; i < args.length; i++) {
      var arg = args[i];

      switch (arg) {
        case '--check-only':
          checkOnly = true;
          break;

        case '--verbose':
          showInfo = true;
          break;

        case '--suppress_warnings':
          showWarnings = false;
          break;

        case '--warnings_as_errors':
          warningsAsErrors = true;
          break;

        case '--throw_on_errors':
          throwOnErrors = true;
          break;

        case '--throw_on_warnings':
          throwOnWarnings = true;
          break;

        case '--no_colors':
          useColors = false;
          break;

        case '--checked':
          checkOnly = true;
          break;

        default:
          if (!ignoreUnrecognizedFlags) {
            print('unrecognized flag: "$arg"');
          }
      }
    }
  }
}
