// 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.

/// Describes a chunk of source code that is to be formatted or has been
/// formatted.
class SourceCode {
  /// The [uri] where the source code is from.
  ///
  /// Used in error messages if the code cannot be parsed.
  final String? uri;

  /// The Dart source code text.
  final String text;

  /// Whether the source is a compilation unit or a bare statement.
  final bool isCompilationUnit;

  /// The offset in [text] where the selection begins, or `null` if there is
  /// no selection.
  final int? selectionStart;

  /// The number of selected characters or `null` if there is no selection.
  final int? selectionLength;

  /// Gets the source code before the beginning of the selection.
  ///
  /// If there is no selection, returns [text].
  String get textBeforeSelection {
    if (selectionStart == null) return text;
    return text.substring(0, selectionStart);
  }

  /// Gets the selected source code, if any.
  ///
  /// If there is no selection, returns an empty string.
  String get selectedText {
    if (selectionStart == null) return '';
    return text.substring(selectionStart!, selectionStart! + selectionLength!);
  }

  /// Gets the source code following the selection.
  ///
  /// If there is no selection, returns an empty string.
  String get textAfterSelection {
    if (selectionStart == null) return '';
    return text.substring(selectionStart! + selectionLength!);
  }

  SourceCode(this.text,
      {this.uri,
      this.isCompilationUnit = true,
      this.selectionStart,
      this.selectionLength}) {
    // Must either provide both selection bounds or neither.
    if ((selectionStart == null) != (selectionLength == null)) {
      throw ArgumentError(
          'Is selectionStart is provided, selectionLength must be too.');
    }

    if (selectionStart != null) {
      if (selectionStart! < 0) {
        throw ArgumentError('selectionStart must be non-negative.');
      }

      if (selectionStart! > text.length) {
        throw ArgumentError('selectionStart must be within text.');
      }
    }

    if (selectionLength != null) {
      if (selectionLength! < 0) {
        throw ArgumentError('selectionLength must be non-negative.');
      }

      if (selectionStart! + selectionLength! > text.length) {
        throw ArgumentError('selectionLength must end within text.');
      }
    }
  }
}
