// 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 'base/file_system.dart';

import 'utils.dart';

/// Data class that holds all results and generated directories from a computeMigration run.
///
/// mergeResults, addedFiles, and deletedFiles includes the sets of files to be migrated while
/// the other members track the temporary sdk and generated app directories created by the tool.
///
/// The compute function does not clean up the temp directories, as the directories may be reused,
/// so this must be done manually afterwards.
class MigrateResult {
  /// Explicitly initialize the MigrateResult.
  MigrateResult(
      {required this.mergeResults,
      required this.addedFiles,
      required this.deletedFiles,
      required this.tempDirectories,
      required this.sdkDirs,
      required this.mergeTypeMap,
      required this.diffMap,
      this.generatedBaseTemplateDirectory,
      this.generatedTargetTemplateDirectory});

  /// Creates a MigrateResult with all empty members.
  MigrateResult.empty()
      : mergeResults = <MergeResult>[],
        addedFiles = <FilePendingMigration>[],
        deletedFiles = <FilePendingMigration>[],
        tempDirectories = <Directory>[],
        mergeTypeMap = <String, MergeType>{},
        diffMap = <String, DiffResult>{},
        sdkDirs = <String, Directory>{};

  /// The results of merging existing files with the target files.
  final List<MergeResult> mergeResults;

  /// Tracks the files that are to be newly added to the project.
  final List<FilePendingMigration> addedFiles;

  /// Tracks the files that are to be deleted from the project.
  final List<FilePendingMigration> deletedFiles;

  /// Tracks the temporary directories created during the migrate compute process.
  final List<Directory> tempDirectories;

  /// Mapping between the local path of a file and the type of merge that should be used.
  final Map<String, MergeType> mergeTypeMap;

  /// Mapping between the local path of a file and the diff between the base and target
  /// versions of the file.
  final Map<String, DiffResult> diffMap;

  /// The root directory of the base app.
  Directory? generatedBaseTemplateDirectory;

  /// The root directory of the target app.
  Directory? generatedTargetTemplateDirectory;

  /// The root directories of the Flutter SDK for each revision.
  Map<String, Directory> sdkDirs;
}

/// Defines available merge techniques.
enum MergeType {
  /// A standard three-way merge.
  threeWay,

  /// A two way merge that ignores the base version of the file.
  twoWay,

  /// A `CustomMerge` manually handles the merge.
  custom,
}

/// Stores a file that has been marked for migration and metadata about the file.
class FilePendingMigration {
  FilePendingMigration(this.localPath, this.file);
  String localPath;
  File file;
}
