// Copyright 2013 The Flutter Authors. 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:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_plugin_tools/src/update_min_sdk_command.dart';
import 'package:test/test.dart';

import 'util.dart';

void main() {
  late FileSystem fileSystem;
  late Directory packagesDir;
  late CommandRunner<void> runner;

  setUp(() {
    fileSystem = MemoryFileSystem();
    packagesDir = createPackagesDirectory(fileSystem: fileSystem);

    final UpdateMinSdkCommand command = UpdateMinSdkCommand(
      packagesDir,
    );
    runner = CommandRunner<void>(
        'update_min_sdk_command', 'Test for update_min_sdk_command');
    runner.addCommand(command);
  });

  test('fails if --flutter-min is missing', () async {
    Error? commandError;
    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
    ], errorHandler: (Error e) {
      commandError = e;
    });

    expect(commandError, isA<ArgumentError>());
  });

  test('updates Dart when only Dart is present, with manual range', () async {
    final RepositoryPackage package = createFakePackage(
        'a_package', packagesDir,
        dartConstraint: '>=3.0.0 <4.0.0');

    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
      '--flutter-min',
      '3.13.0', // Corresponds to Dart 3.1.0
    ]);

    final String dartVersion =
        package.parsePubspec().environment?['sdk'].toString() ?? '';
    expect(dartVersion, '^3.1.0');
  });

  test('updates Dart when only Dart is present, with carrot', () async {
    final RepositoryPackage package =
        createFakePackage('a_package', packagesDir, dartConstraint: '^3.0.0');

    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
      '--flutter-min',
      '3.13.0', // Corresponds to Dart 3.1.0
    ]);

    final String dartVersion =
        package.parsePubspec().environment?['sdk'].toString() ?? '';
    expect(dartVersion, '^3.1.0');
  });

  test('does not update Dart if it is already higher', () async {
    final RepositoryPackage package =
        createFakePackage('a_package', packagesDir, dartConstraint: '^3.2.0');

    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
      '--flutter-min',
      '3.13.0', // Corresponds to Dart 3.1.0
    ]);

    final String dartVersion =
        package.parsePubspec().environment?['sdk'].toString() ?? '';
    expect(dartVersion, '^3.2.0');
  });

  test('updates both Dart and Flutter when both are present', () async {
    final RepositoryPackage package = createFakePackage(
        'a_package', packagesDir,
        isFlutter: true,
        dartConstraint: '>=3.0.0 <4.0.0',
        flutterConstraint: '>=3.10.0');

    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
      '--flutter-min',
      '3.13.0', // Corresponds to Dart 3.1.0
    ]);

    final String dartVersion =
        package.parsePubspec().environment?['sdk'].toString() ?? '';
    final String flutterVersion =
        package.parsePubspec().environment?['flutter'].toString() ?? '';
    expect(dartVersion, '^3.1.0');
    expect(flutterVersion, '>=3.13.0');
  });

  test('does not update Flutter if it is already higher', () async {
    final RepositoryPackage package = createFakePackage(
        'a_package', packagesDir,
        isFlutter: true,
        dartConstraint: '^3.2.0',
        flutterConstraint: '>=3.16.0');

    await runCapturingPrint(runner, <String>[
      'update-min-sdk',
      '--flutter-min',
      '3.13.0', // Corresponds to Dart 3.1.0
    ]);

    final String dartVersion =
        package.parsePubspec().environment?['sdk'].toString() ?? '';
    final String flutterVersion =
        package.parsePubspec().environment?['flutter'].toString() ?? '';
    expect(dartVersion, '^3.2.0');
    expect(flutterVersion, '>=3.16.0');
  });
}
