// Copyright (c) 2014, 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.

import 'package:analyzer/error/error.dart';

// It is hard to visually separate each code's _doc comment_ from its published
// _documentation comment_ when each is written as an end-of-line comment.
// ignore_for_file: slash_for_doc_comments

/**
 * The error code indicating a marker in code for work that needs to be finished
 * or revisited.
 */
class TodoCode extends ErrorCode {
  /**
   * A standard TODO comment marked as TODO.
   */
  static const TodoCode TODO = TodoCode('TODO');

  /**
   * A TODO comment marked as FIXME.
   */
  static const TodoCode FIXME = TodoCode('FIXME');

  /**
   * A TODO comment marked as HACK.
   */
  static const TodoCode HACK = TodoCode('HACK');

  /**
   * A TODO comment marked as UNDONE.
   */
  static const TodoCode UNDONE = TodoCode('UNDONE');

  static const _codes = {
    'TODO': TODO,
    'FIXME': FIXME,
    'HACK': HACK,
    'UNDONE': UNDONE,
  };

  /**
   * This matches the two common Dart task styles
   *
   * * TODO:
   * * TODO(username):
   *
   * As well as
   * * TODO
   *
   * But not
   * * todo
   * * TODOS
   *
   * It also supports wrapped TODOs where the next line is indented by a space:
   *
   *   /**
   *    * TODO(username): This line is
   *    *  wrapped onto the next line
   *    */
   *
   * The matched kind of the TODO (TODO, FIXME, etc.) is returned in named
   * captures of "kind1", "kind2" (since it is not possible to reuse a name
   * across different parts of the regex).
   */
  static RegExp TODO_REGEX = RegExp(
      '([\\s/\\*])(((?<kind1>$_TODO_KIND_PATTERN)[^\\w\\d][^\\r\\n]*(?:\\n\\s*\\*  [^\\r\\n]*)*)'
      '|((?<kind2>$_TODO_KIND_PATTERN):?\$))');

  static final _TODO_KIND_PATTERN = _codes.keys.join('|');

  /**
   * Initialize a newly created error code to have the given [name].
   */
  const TodoCode(String name)
      : super(
          message: "{0}",
          name: name,
          uniqueName: 'TodoCode.$name',
        );

  @override
  ErrorSeverity get errorSeverity => ErrorSeverity.INFO;

  @override
  ErrorType get type => ErrorType.TODO;

  /// Returns the TodoCode for [kind], falling back to [TODO].
  static TodoCode forKind(String kind) => _codes[kind] ?? TODO;
}
