// Copyright (c) 2019, 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 '../validator.dart';

const _pluginDocsUrl =
    'https://flutter.dev/docs/development/packages-and-plugins/developing-packages#plugin';

/// Validates that Flutter plugins doesn't use both new and old plugin format.
///
/// Warns if using the old plugin registration format.
///
/// See:
/// https://flutter.dev/docs/development/packages-and-plugins/developing-packages
class FlutterPluginFormatValidator extends Validator {
  @override
  Future validate() async {
    final pubspec = package.pubspec;

    if (pubspec.fields case {'flutter': {'plugin': final Map plugin}}) {
      // Determine if this uses the old format by checking if `flutter.plugin`
      // contains any of the following keys.
      final usesOldPluginFormat = const {
        'androidPackage',
        'iosPrefix',
        'pluginClass',
      }.any(plugin.containsKey);
      // Determine if this uses the new format by check if the:
      // `flutter.plugin.platforms` keys is defined.
      final usesNewPluginFormat = plugin['platforms'] != null;

      // If the new plugin format is used, and the flutter SDK dependency allows
      // SDKs older than 1.10.0, then this is going to be a problem.
      final flutterConstraint = pubspec.sdkConstraints['flutter'];
      if (usesNewPluginFormat &&
          (flutterConstraint == null ||
              flutterConstraint.effectiveConstraint.allowsAny(
                VersionRange(
                  min: Version.parse('0.0.0'),
                  max: Version.parse('1.10.0'),
                  includeMin: true,
                ),
              ))) {
        errors.add('pubspec.yaml allows Flutter SDK version 1.9.x, which does '
            'not support the flutter.plugin.platforms key.\n'
            'Please consider increasing the Flutter SDK requirement to '
            '^1.10.0 (environment.sdk.flutter)\n\nSee $_pluginDocsUrl');
        return;
      }

      if (usesOldPluginFormat) {
        errors.add('In pubspec.yaml the '
            'flutter.plugin.{androidPackage,iosPrefix,pluginClass} keys are '
            'deprecated. Instead use the flutter.plugin.platforms key '
            'introduced in Flutter 1.10.0\n\nSee $_pluginDocsUrl');
      }
    } else {
      // Ignore all packages that do not have the `flutter.plugin` property.
    }
  }
}
