// 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:file/memory.dart';

import 'package:flutter_migrate/src/base/file_system.dart';
import 'package:flutter_migrate/src/base/logger.dart';
import 'package:flutter_migrate/src/custom_merge.dart';
import 'package:flutter_migrate/src/utils.dart';

import 'src/common.dart';

void main() {
  late FileSystem fileSystem;
  late BufferLogger logger;

  setUpAll(() {
    fileSystem = MemoryFileSystem.test();
    logger = BufferLogger.test();
  });

  group('.metadata merge', () {
    late MetadataCustomMerge merger;

    setUp(() {
      merger = MetadataCustomMerge(logger: logger);
    });

    testWithoutContext('merges empty', () async {
      const String current = '';
      const String base = '';
      const String target = '';
      final File currentFile = fileSystem.file('.metadata_current');
      final File baseFile = fileSystem.file('.metadata_base');
      final File targetFile = fileSystem.file('.metadata_target');

      currentFile
        ..createSync(recursive: true)
        ..writeAsStringSync(current, flush: true);
      baseFile
        ..createSync(recursive: true)
        ..writeAsStringSync(base, flush: true);
      targetFile
        ..createSync(recursive: true)
        ..writeAsStringSync(target, flush: true);

      final StringMergeResult result =
          merger.merge(currentFile, baseFile, targetFile) as StringMergeResult;
      expect(
          result.mergedString,
          '''
# 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.

version:
  revision: null
  channel: null

project_type: '''
          '''


# Tracks metadata for the flutter migrate command
migration:
  platforms:

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
''');
    });

    testWithoutContext('merge adds migration section', () async {
      const String current = '''
# my own comment
version:
  revision: abcdefg12345
  channel: stable
project_type: app
      ''';
      const String base = '''
version:
  revision: abcdefg12345base
  channel: stable
project_type: app
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevision
      base_revision: somebaserevision
    - platform: android
      create_revision: somecreaterevision
      base_revision: somebaserevision
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
''';
      const String target = '''
version:
  revision: abcdefg12345target
  channel: stable
project_type: app
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevision
      base_revision: somebaserevision
    - platform: android
      create_revision: somecreaterevision
      base_revision: somebaserevision
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
''';
      final File currentFile = fileSystem.file('.metadata_current');
      final File baseFile = fileSystem.file('.metadata_base');
      final File targetFile = fileSystem.file('.metadata_target');

      currentFile
        ..createSync(recursive: true)
        ..writeAsStringSync(current, flush: true);
      baseFile
        ..createSync(recursive: true)
        ..writeAsStringSync(base, flush: true);
      targetFile
        ..createSync(recursive: true)
        ..writeAsStringSync(target, flush: true);

      final StringMergeResult result =
          merger.merge(currentFile, baseFile, targetFile) as StringMergeResult;
      expect(result.mergedString, '''
# 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.

version:
  revision: abcdefg12345target
  channel: stable

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevision
      base_revision: somebaserevision
    - platform: android
      create_revision: somecreaterevision
      base_revision: somebaserevision

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
''');
    });

    testWithoutContext('merge handles standard migration flow', () async {
      const String current = '''
# my own comment
version:
  revision: abcdefg12345current
  channel: stable
project_type: app
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevisioncurrent
      base_revision: somebaserevisioncurrent
    - platform: android
      create_revision: somecreaterevisioncurrent
      base_revision: somebaserevisioncurrent
  unmanaged_files:
    - 'lib/main.dart'
    - 'new/file.dart'
      ''';
      const String base = '''
version:
  revision: abcdefg12345base
  channel: stable
project_type: app
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevisionbase
      base_revision: somebaserevisionbase
    - platform: android
      create_revision: somecreaterevisionbase
      base_revision: somebaserevisionbase
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
      ''';
      const String target = '''
version:
  revision: abcdefg12345target
  channel: stable
project_type: app
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevisiontarget
      base_revision: somebaserevisiontarget
    - platform: android
      create_revision: somecreaterevisiontarget
      base_revision: somebaserevisiontarget
  unmanaged_files:
    - 'lib/main.dart'
    - 'ios/Runner.xcodeproj/project.pbxproj'
    - 'extra/file'
''';
      final File currentFile = fileSystem.file('.metadata_current');
      final File baseFile = fileSystem.file('.metadata_base');
      final File targetFile = fileSystem.file('.metadata_target');

      currentFile
        ..createSync(recursive: true)
        ..writeAsStringSync(current, flush: true);
      baseFile
        ..createSync(recursive: true)
        ..writeAsStringSync(base, flush: true);
      targetFile
        ..createSync(recursive: true)
        ..writeAsStringSync(target, flush: true);

      final StringMergeResult result =
          merger.merge(currentFile, baseFile, targetFile) as StringMergeResult;
      expect(result.mergedString, '''
# 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.

version:
  revision: abcdefg12345target
  channel: stable

project_type: app

# Tracks metadata for the flutter migrate command
migration:
  platforms:
    - platform: root
      create_revision: somecreaterevisioncurrent
      base_revision: somebaserevisiontarget
    - platform: android
      create_revision: somecreaterevisioncurrent
      base_revision: somebaserevisiontarget

  # User provided section

  # List of Local paths (relative to this file) that should be
  # ignored by the migrate tool.
  #
  # Files that are not part of the templates will be ignored by default.
  unmanaged_files:
    - 'lib/main.dart'
    - 'new/file.dart'
    - 'extra/file'
''');
    });
  });
}
