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

import 'dart:async';

import 'package:pub_semver/pub_semver.dart';

import '../exceptions.dart';
import '../log.dart' as log;
import '../package_name.dart';
import '../sdk.dart';
import '../source/git.dart';
import '../source/hosted.dart';
import '../source/path.dart';
import '../source/sdk.dart';
import '../validator.dart';

/// The first Dart SDK version that supported caret constraints.
final _firstCaretVersion = Version.parse('1.8.0-dev.3.0');

/// The first Dart SDK version that supported Git path dependencies.
final _firstGitPathVersion = Version.parse('2.0.0-dev.1.0');

/// A validator that validates a package's dependencies.
class DependencyValidator extends Validator {
  @override
  Future validate() async {
    /// Whether any dependency has a caret constraint.
    var _hasCaretDep = false;

    /// Emit an error for dependencies from unknown SDKs or without appropriate
    /// constraints on the Dart SDK.
    void _warnAboutSdkSource(PackageRange dep) {
      var identifier = (dep.description as SdkDescription).sdk;
      var sdk = sdks[identifier];
      if (sdk == null) {
        errors.add('Unknown SDK "$identifier" for dependency "${dep.name}".');
        return;
      }

      validateSdkConstraint(sdk.firstPubVersion,
          "Older versions of pub don't support the ${sdk.name} SDK.");
    }

    /// Warn that dependencies should use the hosted source.
    Future _warnAboutSource(PackageRange dep) async {
      List<Version> versions;
      try {
        var ids = await entrypoint.cache
            .getVersions(entrypoint.cache.hosted.refFor(dep.name));
        versions = ids.map((id) => id.version).toList();
      } on ApplicationException catch (_) {
        versions = [];
      }

      String constraint;
      if (versions.isNotEmpty) {
        constraint = '^${Version.primary(versions)}';
      } else {
        constraint = dep.constraint.toString();
        if (!dep.constraint.isAny && dep.constraint is! Version) {
          constraint = '"$constraint"';
        }
      }

      // Path sources are errors. Other sources are just warnings.
      var messages = dep.source is PathSource ? errors : warnings;

      messages.add('Don\'t depend on "${dep.name}" from the ${dep.source} '
          'source. Use the hosted source instead. For example:\n'
          '\n'
          'dependencies:\n'
          '  ${dep.name}: $constraint\n'
          '\n'
          'Using the hosted source ensures that everyone can download your '
          'package\'s dependencies along with your package.');
    }

    /// Warn about improper dependencies on Flutter.
    void _warnAboutFlutterSdk(PackageRange dep) {
      if (dep.source is SdkSource) {
        _warnAboutSdkSource(dep);
        return;
      }

      errors.add('Don\'t depend on "${dep.name}" from the ${dep.source} '
          'source. Use the SDK source instead. For example:\n'
          '\n'
          'dependencies:\n'
          '  ${dep.name}:\n'
          '    sdk: ${dep.constraint}\n'
          '\n'
          'The Flutter SDK is downloaded and managed outside of pub.');
    }

    /// Warn that dependencies should have version constraints.
    void _warnAboutNoConstraint(PackageRange dep) {
      var message = 'Your dependency on "${dep.name}" should have a version '
          'constraint.';
      var locked = entrypoint.lockFile.packages[dep.name];
      if (locked != null) {
        message = '$message For example:\n'
            '\n'
            'dependencies:\n'
            '  ${dep.name}: ^${locked.version}\n';
      }
      warnings.add('$message\n'
          'Without a constraint, you\'re promising to support ${log.bold("all")} '
          'future versions of "${dep.name}".');
    }

    /// Warn that dependencies should allow more than a single version.
    void _warnAboutSingleVersionConstraint(PackageRange dep) {
      warnings.add(
          'Your dependency on "${dep.name}" should allow more than one version. '
          'For example:\n'
          '\n'
          'dependencies:\n'
          '  ${dep.name}: ^${dep.constraint}\n'
          '\n'
          'Constraints that are too tight will make it difficult for people to '
          'use your package\n'
          'along with other packages that also depend on "${dep.name}".');
    }

    /// Warn that dependencies should have lower bounds on their constraints.
    void _warnAboutNoConstraintLowerBound(PackageRange dep) {
      var message =
          'Your dependency on "${dep.name}" should have a lower bound.';
      var locked = entrypoint.lockFile.packages[dep.name];
      if (locked != null) {
        String constraint;
        if (locked.version == (dep.constraint as VersionRange).max) {
          constraint = '^${locked.version}';
        } else {
          constraint = '">=${locked.version} ${dep.constraint}"';
        }

        message = '$message For example:\n'
            '\n'
            'dependencies:\n'
            '  ${dep.name}: $constraint\n';
      }
      warnings.add('$message\n'
          'Without a constraint, you\'re promising to support ${log.bold("all")} '
          'previous versions of "${dep.name}".');
    }

    /// Warn that dependencies should have upper bounds on their constraints.
    void _warnAboutNoConstraintUpperBound(PackageRange dep) {
      String constraint;
      if ((dep.constraint as VersionRange).includeMin) {
        constraint = '^${(dep.constraint as VersionRange).min}';
      } else {
        constraint = '"${dep.constraint} '
            '<${(dep.constraint as VersionRange).min!.nextBreaking}"';
      }
      // TODO: Handle the case where `dep.constraint.min` is null.

      warnings.add(
          'Your dependency on "${dep.name}" should have an upper bound. For '
          'example:\n'
          '\n'
          'dependencies:\n'
          '  ${dep.name}: $constraint\n'
          '\n'
          'Without an upper bound, you\'re promising to support '
          '${log.bold("all")} future versions of ${dep.name}.');
    }

    void _warnAboutPrerelease(String dependencyName, VersionRange constraint) {
      final packageVersion = entrypoint.root.version;
      if (constraint.min != null &&
          constraint.min!.isPreRelease &&
          !packageVersion.isPreRelease) {
        warnings.add('Packages dependent on a pre-release of another package '
            'should themselves be published as a pre-release version. '
            'If this package needs $dependencyName version ${constraint.min}, '
            'consider publishing the package as a pre-release instead.\n'
            'See https://dart.dev/tools/pub/publishing#publishing-prereleases '
            'For more information on pre-releases.');
      }
    }

    /// Validates all dependencies in [dependencies].
    Future _validateDependencies(Iterable<PackageRange> dependencies) async {
      for (var dependency in dependencies) {
        var constraint = dependency.constraint;
        if (dependency.name == 'flutter') {
          _warnAboutFlutterSdk(dependency);
        } else if (dependency.source is SdkSource) {
          _warnAboutSdkSource(dependency);
        } else if (dependency.source is! HostedSource) {
          await _warnAboutSource(dependency);

          final description = dependency.description;
          if (description is GitDescription && description.path != '.') {
            validateSdkConstraint(_firstGitPathVersion,
                "Older versions of pub don't support Git path dependencies.");
          }
        } else {
          if (constraint.isAny) {
            _warnAboutNoConstraint(dependency);
          } else if (constraint is VersionRange) {
            if (constraint is Version) {
              _warnAboutSingleVersionConstraint(dependency);
            } else {
              _warnAboutPrerelease(dependency.name, constraint);
              if (constraint.min == null) {
                _warnAboutNoConstraintLowerBound(dependency);
              } else if (constraint.max == null) {
                _warnAboutNoConstraintUpperBound(dependency);
              }
            }
            _hasCaretDep =
                _hasCaretDep || constraint.toString().startsWith('^');
          }
        }
      }
    }

    await _validateDependencies(entrypoint.root.pubspec.dependencies.values);

    if (_hasCaretDep) {
      validateSdkConstraint(_firstCaretVersion,
          "Older versions of pub don't support ^ version constraints.");
    }
  }
}
