// 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:flutter_migrate/src/base/common.dart';
import 'package:flutter_migrate/src/base/file_system.dart';
import 'package:flutter_migrate/src/base/io.dart';
import 'package:flutter_migrate/src/base/logger.dart';
import 'package:flutter_migrate/src/base/signals.dart';
import 'package:flutter_migrate/src/base/terminal.dart';
import 'package:process/process.dart';

import 'src/common.dart';
import 'src/context.dart';
import 'test_data/migrate_project.dart';

// This file contains E2E test that execute the core migrate commands
// and simulates manual conflict resolution and other manipulations of
// the project files.
void main() {
  late Directory tempDir;
  late BufferLogger logger;
  late ProcessManager processManager;
  late FileSystem fileSystem;

  setUp(() async {
    logger = BufferLogger.test();
    processManager = const LocalProcessManager();
    fileSystem = LocalFileSystem.test(signals: LocalSignals.instance);
    tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_run_test');
  });

  tearDown(() async {
    tryToDelete(tempDir);
  });

  Future<bool> hasFlutterEnvironment() async {
    final String flutterRoot = getFlutterRoot();
    final String flutterExecutable = fileSystem.path
        .join(flutterRoot, 'bin', 'flutter${isWindows ? '.bat' : ''}');
    final ProcessResult result = await Process.run(
        flutterExecutable, <String>['analyze', '--suggestions', '--machine']);
    if (result.exitCode != 0) {
      return false;
    }
    return true;
  }

  // Migrates a clean untouched app generated with flutter create
  testUsingContext('vanilla migrate process succeeds', () async {
    // This tool does not support old versions of flutter that dont include
    // `flutter analyze --suggestions --machine` command
    if (!await hasFlutterEnvironment()) {
      return;
    }
    // Flutter Stable 1.22.6 hash: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
    await MigrateProject.installProject('version:1.22.6_stable', tempDir);

    ProcessResult result = await runMigrateCommand(<String>[
      'start',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.stdout.toString(), contains('Staging directory created at'));
    const String linesToMatch = '''
Added files:
  - android/app/src/main/res/values-night/styles.xml
  - android/app/src/main/res/drawable-v21/launch_background.xml
  - analysis_options.yaml
Modified files:
  - .metadata
  - ios/Runner/Info.plist
  - ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  - ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  - ios/Flutter/AppFrameworkInfo.plist
  - ios/.gitignore
  - pubspec.yaml
  - .gitignore
  - android/app/build.gradle
  - android/app/src/profile/AndroidManifest.xml
  - android/app/src/main/res/values/styles.xml
  - android/app/src/main/AndroidManifest.xml
  - android/app/src/debug/AndroidManifest.xml
  - android/gradle/wrapper/gradle-wrapper.properties
  - android/.gitignore
  - android/build.gradle''';
    for (final String line in linesToMatch.split('\n')) {
      expect(result.stdout.toString(), contains(line));
    }

    result = await runMigrateCommand(<String>[
      'apply',
      '--verbose',
    ], workingDirectory: tempDir.path);
    logger.printStatus('${result.exitCode}', color: TerminalColor.blue);
    logger.printStatus(result.stdout, color: TerminalColor.green);
    logger.printStatus(result.stderr, color: TerminalColor.red);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Migration complete'));

    expect(tempDir.childFile('.metadata').readAsStringSync(),
        contains('migration:\n  platforms:\n    - platform: root\n'));

    expect(
        tempDir
            .childFile('android/app/src/main/res/values-night/styles.xml')
            .existsSync(),
        true);
    expect(tempDir.childFile('analysis_options.yaml').existsSync(), true);
  }, timeout: const Timeout(Duration(seconds: 500)), skip: isWindows);

  // Migrates a clean untouched app generated with flutter create
  testUsingContext('vanilla migrate builds', () async {
    // This tool does not support old versions of flutter that dont include
    // `flutter analyze --suggestions --machine` command
    if (!await hasFlutterEnvironment()) {
      return;
    }
    // Flutter Stable 2.0.0 hash: 60bd88df915880d23877bfc1602e8ddcf4c4dd2a
    await MigrateProject.installProject('version:2.0.0_stable', tempDir,
        main: '''
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Container(),
    );
  }
}
''');
    ProcessResult result = await runMigrateCommand(<String>[
      'start',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.stdout.toString(), contains('Staging directory created at'));

    result = await runMigrateCommand(<String>[
      'apply',
      '--verbose',
    ], workingDirectory: tempDir.path);
    logger.printStatus('${result.exitCode}', color: TerminalColor.blue);
    logger.printStatus(result.stdout, color: TerminalColor.green);
    logger.printStatus(result.stderr, color: TerminalColor.red);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Migration complete'));

    result = await processManager.run(<String>[
      'flutter',
      'build',
      'apk',
      '--debug',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('app-debug.apk'));
    // Skipped due to being flaky, the build completes successfully, but sometimes
    // Gradle crashes due to resources on the bot. We should fine tune this to
    // make it stable.
  }, timeout: const Timeout(Duration(seconds: 900)), skip: true);

  testUsingContext('migrate abandon', () async {
    // Abandon in an empty dir fails.
    ProcessResult result = await runMigrateCommand(<String>[
      'abandon',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stderr.toString(),
        contains('Error: No pubspec.yaml file found'));
    expect(
        result.stderr.toString(),
        contains(
            'This command should be run from the root of your Flutter project'));

    final File manifestFile =
        tempDir.childFile('migrate_staging_dir/.migrate_manifest');
    expect(manifestFile.existsSync(), false);

    // Flutter Stable 1.22.6 hash: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
    await MigrateProject.installProject('version:1.22.6_stable', tempDir);

    // Initialized repo fails.
    result = await runMigrateCommand(<String>[
      'abandon',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('No migration in progress'));

    // Create migration.
    manifestFile.createSync(recursive: true);

    // Directory with manifest_staging_dir succeeds.
    result = await runMigrateCommand(<String>[
      'abandon',
      '--verbose',
      '--force',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Abandon complete'));
  }, timeout: const Timeout(Duration(seconds: 300)));

  // Migrates a user-modified app
  testUsingContext('modified migrate process succeeds', () async {
    // This tool does not support old versions of flutter that dont include
    // `flutter analyze --suggestions --machine` command
    if (!await hasFlutterEnvironment()) {
      return;
    }
    // Flutter Stable 1.22.6 hash: 9b2d32b605630f28625709ebd9d78ab3016b2bf6
    await MigrateProject.installProject('version:1.22.6_stable', tempDir,
        vanilla: false);

    ProcessResult result = await runMigrateCommand(<String>[
      'apply',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('No migration'));

    result = await runMigrateCommand(<String>[
      'status',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('No migration'));

    result = await runMigrateCommand(<String>[
      'start',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Staging directory created at'));
    const String linesToMatch = '''
Modified files:
  - .metadata
  - ios/Runner/Info.plist
  - ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  - ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  - ios/Flutter/AppFrameworkInfo.plist
  - ios/.gitignore
  - .gitignore
  - android/app/build.gradle
  - android/app/src/profile/AndroidManifest.xml
  - android/app/src/main/res/values/styles.xml
  - android/app/src/main/AndroidManifest.xml
  - android/app/src/debug/AndroidManifest.xml
  - android/gradle/wrapper/gradle-wrapper.properties
  - android/.gitignore
  - android/build.gradle
Merge conflicted files:
  - pubspec.yaml''';
    for (final String line in linesToMatch.split('\n')) {
      expect(result.stdout.toString(), contains(line));
    }

    // Call apply with conflicts remaining. Should fail.
    result = await runMigrateCommand(<String>[
      'apply',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(
        result.stdout.toString(),
        contains(
            'Conflicting files found. Resolve these conflicts and try again.'));
    expect(result.stdout.toString(), contains('- pubspec.yaml'));

    result = await runMigrateCommand(<String>[
      'status',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Modified files'));
    expect(result.stdout.toString(), contains('Merge conflicted files'));

    // Manually resolve conflics. The correct contents for resolution may change over time,
    // but it shouldnt matter for this test.
    final File metadataFile =
        tempDir.childFile('migrate_staging_dir/.metadata');
    metadataFile.writeAsStringSync('''
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: e96a72392696df66755ca246ff291dfc6ca6c4ad
  channel: unknown

project_type: app

''', flush: true);
    final File pubspecYamlFile =
        tempDir.childFile('migrate_staging_dir/pubspec.yaml');
    pubspecYamlFile.writeAsStringSync('''
name: vanilla_app_1_22_6_stable
description: This is a modified description from the default.

# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.17.0-79.0.dev <3.0.0"

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2

dev_dependencies:
  flutter_test:
    sdk: flutter

  # The "flutter_lints" package below contains a set of recommended lints to
  # encourage good coding practices. The lint set provided by the package is
  # activated in the `analysis_options.yaml` file located at the root of your
  # package. See that file for information about deactivating specific lint
  # rules and activating additional ones.
  flutter_lints: ^1.0.0

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter packages.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - images/a_dot_burr.jpeg
    - images/a_dot_ham.jpeg

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages

''', flush: true);

    result = await runMigrateCommand(<String>[
      'status',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Modified files'));
    expect(result.stdout.toString(), contains('diff --git'));
    expect(result.stdout.toString(), contains('@@'));
    expect(result.stdout.toString(), isNot(contains('Merge conflicted files')));

    result = await runMigrateCommand(<String>[
      'apply',
      '--verbose',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('Migration complete'));

    expect(tempDir.childFile('.metadata').readAsStringSync(),
        contains('e96a72392696df66755ca246ff291dfc6ca6c4ad'));
    expect(tempDir.childFile('pubspec.yaml').readAsStringSync(),
        isNot(contains('">=2.6.0 <3.0.0"')));
    expect(tempDir.childFile('pubspec.yaml').readAsStringSync(),
        contains('">=2.17.0-79.0.dev <3.0.0"'));
    expect(
        tempDir.childFile('pubspec.yaml').readAsStringSync(),
        contains(
            'description: This is a modified description from the default.'));
    expect(tempDir.childFile('lib/main.dart').readAsStringSync(),
        contains('OtherWidget()'));
    expect(tempDir.childFile('lib/other.dart').existsSync(), true);
    expect(tempDir.childFile('lib/other.dart').readAsStringSync(),
        contains('class OtherWidget'));

    expect(
        tempDir
            .childFile('android/app/src/main/res/values-night/styles.xml')
            .existsSync(),
        true);
    expect(tempDir.childFile('analysis_options.yaml').existsSync(), true);
  }, timeout: const Timeout(Duration(seconds: 500)), skip: isWindows);
}
