// Copyright (c) 2021, 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:pub_semver/pub_semver.dart';
import 'package:source_span/source_span.dart';
import 'package:yaml/yaml.dart';

import 'exceptions.dart';
import 'utils.dart' show identifierRegExp, reservedWords;

/// A regular expression matching allowed package names.
///
/// This allows dot-separated valid Dart identifiers. The dots are there for
/// compatibility with Google's internal Dart packages, but they may not be used
/// when publishing a package to pub.dev.
final packageNameRegExp =
    RegExp('^${identifierRegExp.pattern}(\\.${identifierRegExp.pattern})*\$');

/// Helper class for pubspec parsing to:
/// - extract the fields and methods that are reusable outside of `pub` client, and
/// - help null-safety migration a bit.
///
/// This class should be eventually extracted to a separate library, or re-merged with `Pubspec`.
abstract class PubspecBase {
  /// All pubspec fields.
  ///
  /// This includes the fields from which other properties are derived.
  final YamlMap fields;

  PubspecBase(
    this.fields, {
    String? name,
    Version? version,
  })  : _name = name,
        _version = version;

  /// The package's name.
  String get name => _name ??= _lookupName();

  String _lookupName() {
    final name = fields['name'];
    if (name == null) {
      throw SourceSpanApplicationException(
        'Missing the required "name" field.',
        fields.span,
      );
    } else if (name is! String) {
      throw SourceSpanApplicationException(
        '"name" field must be a string.',
        fields.nodes['name']?.span,
      );
    } else if (!packageNameRegExp.hasMatch(name)) {
      throw SourceSpanApplicationException(
        '"name" field must be a valid Dart identifier.',
        fields.nodes['name']?.span,
      );
    } else if (reservedWords.contains(name.toLowerCase())) {
      throw SourceSpanApplicationException(
        '"name" field may not be a Dart reserved word.',
        fields.nodes['name']?.span,
      );
    }

    return name;
  }

  String? _name;

  /// The package's version.
  Version get version {
    if (_version != null) return _version!;

    final version = fields['version'];
    if (version == null) {
      _version = Version.none;
      return _version!;
    }

    final span = fields.nodes['version']?.span;
    if (version is num) {
      var fixed = '$version.0';
      if (version is int) {
        fixed = '$fixed.0';
      }
      _error(
        '"version" field must have three numeric components: major, '
        'minor, and patch. Instead of "$version", consider "$fixed".',
        span,
      );
    }
    if (version is! String) {
      _error('"version" field must be a string.', span);
    }

    _version = _wrapFormatException(
      'version number',
      span,
      () => Version.parse(version),
    );
    return _version!;
  }

  Version? _version;

  /// The URL of the server that the package should default to being published
  /// to, "none" if the package should not be published, or `null` if it should
  /// be published to the default server.
  ///
  /// If this does return a URL string, it will be a valid parseable URL.
  String? get publishTo {
    if (_parsedPublishTo) return _publishTo;

    final publishTo = fields['publish_to'];
    if (publishTo != null) {
      final span = fields.nodes['publish_to']?.span;

      if (publishTo is! String) {
        _error('"publish_to" field must be a string.', span);
      }

      // It must be "none" or a valid URL.
      if (publishTo != 'none') {
        _wrapFormatException('"publish_to" field', span, () {
          final url = Uri.parse(publishTo);
          if (url.scheme.isEmpty) {
            throw FormatException('must be an absolute URL.');
          }
        });
      }
    }

    _parsedPublishTo = true;
    _publishTo = publishTo as String?;
    return _publishTo;
  }

  bool _parsedPublishTo = false;
  String? _publishTo;

  /// The list of advisory IDs to be ignored when reporting security advisories
  /// affecting dependencies.
  Set<String> get ignoredAdvisories {
    var advisoryIDs = _ignoredAdvisories;
    if (advisoryIDs != null) {
      return advisoryIDs;
    }
    advisoryIDs = <String>{};

    Never ignoredAdvisoriesError(SourceSpan span) => _error(
          '"ignored_advisories" field must be a list of advisory IDs',
          span,
        );

    final ignoredAdvisoriesNode = fields.nodes['ignored_advisories'];
    if (ignoredAdvisoriesNode == null) {
      return _ignoredAdvisories = Set.unmodifiable(advisoryIDs);
    }
    if (ignoredAdvisoriesNode is! YamlList) {
      ignoredAdvisoriesError(ignoredAdvisoriesNode.span);
    }
    for (final node in ignoredAdvisoriesNode.nodes) {
      final value = node.value;
      if (value is! String) {
        ignoredAdvisoriesError(node.span);
      }
      advisoryIDs.add(value);
    }

    return _ignoredAdvisories = Set.unmodifiable(advisoryIDs);
  }

  Set<String>? _ignoredAdvisories;

  /// The list of patterns covering _false-positive secrets_ in the package.
  ///
  /// This is a list of git-ignore style patterns for files that should be
  /// ignored when trying to detect possible leaks of secrets during
  /// package publication.
  List<String> get falseSecrets {
    var falseSecrets = _falseSecrets;
    if (falseSecrets != null) {
      return falseSecrets;
    }
    falseSecrets = <String>[];

    // Throws a [PubspecException]
    Never falseSecretsError(SourceSpan span) => _error(
          '"false_secrets" field must be a list of git-ignore style patterns',
          span,
        );

    final falseSecretsNode = fields.nodes['false_secrets'];
    if (falseSecretsNode == null) {
      return _falseSecrets = List.unmodifiable(falseSecrets);
    }
    if (falseSecretsNode is! YamlList) {
      falseSecretsError(falseSecretsNode.span);
    }

    for (final node in falseSecretsNode.nodes) {
      final value = node.value;
      if (value is! String) {
        falseSecretsError(node.span);
      }
      falseSecrets.add(value);
    }

    return _falseSecrets = List.unmodifiable(falseSecrets);
  }

  List<String>? _falseSecrets;

  /// The executables that should be placed on the user's PATH when this
  /// package is globally activated.
  ///
  /// It is a map of strings to string. Each key is the name of the command
  /// that will be placed on the user's PATH. The value is the name of the
  /// .dart script (without extension) in the package's `bin` directory that
  /// should be run for that command. Both key and value must be "simple"
  /// strings: alphanumerics, underscores and hyphens only. If a value is
  /// omitted, it is inferred to use the same name as the key.
  Map<String, String> get executables {
    if (_executables != null) return _executables!;

    _executables = {};
    var yaml = fields['executables'];
    if (yaml == null) return _executables!;

    if (yaml is! YamlMap) {
      _error(
        '"executables" field must be a map.',
        fields.nodes['executables']?.span,
      );
    }

    var yamlMap = yaml;

    yamlMap.nodes.forEach((key, value) {
      key = key as YamlNode;
      final keyValue = key.value;
      if (keyValue is! String) {
        _error('"executables" keys must be strings.', key.span);
      }

      final keyPattern = RegExp(r'^[a-zA-Z0-9_-]+$');
      if (!keyPattern.hasMatch(keyValue)) {
        _error(
          '"executables" keys may only contain letters, '
          'numbers, hyphens and underscores.',
          key.span,
        );
      }

      final valuePattern = RegExp(r'[/\\]');
      _executables![keyValue] = switch (value.value) {
        null => keyValue,
        String s when valuePattern.hasMatch(s) => _error(
            '"executables" values may not contain path separators.',
            value.span,
          ),
        String s => s,
        _ => _error('"executables" values must be strings or null.', value.span)
      };
    });

    return _executables!;
  }

  Map<String, String>? _executables;

  /// Whether the package is private and cannot be published.
  ///
  /// This is specified in the pubspec by setting "publish_to" to "none".
  bool get isPrivate => publishTo == 'none';

  /// Runs [fn] and wraps any [FormatException] it throws in a
  /// [SourceSpanApplicationException].
  ///
  /// [description] should be a noun phrase that describes whatever's being
  /// parsed or processed by [fn]. [span] should be the location of whatever's
  /// being processed within the pubspec.
  ///
  /// If [targetPackage] is provided, the value is used to describe the
  /// dependency that caused the problem.
  T _wrapFormatException<T>(
    String description,
    SourceSpan? span,
    T Function() fn, {
    String? targetPackage,
  }) {
    try {
      return fn();
    } on FormatException catch (e) {
      var msg = 'Invalid $description';
      if (targetPackage != null) {
        msg = '$msg in the "$name" pubspec on the "$targetPackage" dependency';
      }
      msg = '$msg: ${e.message}';
      throw SourceSpanApplicationException(msg, span);
    }
  }

  /// Throws a [SourceSpanApplicationException] with the given message.
  Never _error(String message, SourceSpan? span) {
    throw SourceSpanApplicationException(message, span);
  }
}
