// Copyright (c) 2020, 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 'package:cli_util/cli_logging.dart';
import 'package:nnbd_migration/instrumentation.dart';
import 'package:nnbd_migration/migration_cli.dart';
import 'package:nnbd_migration/nnbd_migration.dart';
import 'package:nnbd_migration/src/front_end/dartfix_listener.dart';
import 'package:nnbd_migration/src/front_end/info_builder.dart';
import 'package:nnbd_migration/src/front_end/instrumentation_listener.dart';
import 'package:nnbd_migration/src/front_end/migration_info.dart';
import 'package:nnbd_migration/src/front_end/path_mapper.dart';
import 'package:pub_semver/src/version.dart';

/// The state of an NNBD migration.
class MigrationState {
  bool _hasBeenApplied = false;

  /// The migration associated with the state.
  final NullabilityMigration? migration;

  /// The root directory that contains all of the files that were migrated.
  final String? includedRoot;

  /// The mapper user to give nodes ids.
  final NodeMapper nodeMapper = SimpleNodeMapper();

  /// The listener used to collect fixes.
  final DartFixListener? listener;

  /// The listener that collected information during the migration.
  final InstrumentationListener? instrumentationListener;

  /// The information that was built from the rest of the migration state.
  MigrationInfo? migrationInfo;

  /// The object used to map paths.
  PathMapper? pathMapper;

  /// If there have been changes to disk so the migration needs to be rerun.
  bool needsRerun = false;

  final AnalysisResult? analysisResult;

  late List<String>? previewUrls;

  /// Map of additional package dependencies that will be required by the
  /// migrated code.  Keys are package names; values indicate the minimum
  /// required version of each package.
  final Map<String, Version> neededPackages;

  /// A function which returns whether a file at a given path should be
  /// migrated.
  final bool Function(String?) shouldBeMigratedFunction;

  /// Initialize a newly created migration state with the given values.
  MigrationState(
      this.migration,
      this.includedRoot,
      this.listener,
      this.instrumentationListener,
      this.neededPackages,
      this.shouldBeMigratedFunction,
      [this.analysisResult]);

  /// If the migration has been applied to disk.
  bool get hasBeenApplied => _hasBeenApplied;

  bool get hasErrors => analysisResult?.hasErrors ?? false;

  /// Mark that the migration has been applied to disk.
  void markApplied() {
    assert(!hasBeenApplied);
    _hasBeenApplied = true;
  }

  /// Refresh the state of the migration after the migration has been updated.
  Future<void> refresh(Logger logger, Iterable<String>? pathsToProcess) async {
    assert(!hasBeenApplied);
    var provider = listener!.server!.resourceProvider;
    var infoBuilder = InfoBuilder(
        provider,
        includedRoot,
        instrumentationListener!.data,
        listener,
        migration,
        nodeMapper,
        logger,
        shouldBeMigratedFunction,
        pathsToProcess);
    var unitInfos = await infoBuilder.explainMigration();
    var pathContext = provider.pathContext;
    migrationInfo = MigrationInfo(
        unitInfos, infoBuilder.unitMap, pathContext, includedRoot);
    pathMapper = PathMapper(provider);
  }
}
