// Copyright (c) 2014, 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 'dart:async';

import '../command.dart';
import '../exit_codes.dart' as exit_codes;
import '../log.dart' as log;
import '../source/cached.dart';
import '../utils.dart';

/// Handles the `cache repair` pub command.
class CacheRepairCommand extends PubCommand {
  @override
  String get name => 'repair';
  @override
  String get description => 'Reinstall cached packages.';
  @override
  String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-cache';
  @override
  bool get takesArguments => false;

  @override
  Future<void> runProtected() async {
    // Repair every cached source.
    final repairResults = (await Future.wait(
            cache.sources.all.map(cache.source).map((source) async {
      return source is CachedSource
          ? await source.repairCachedPackages()
          : <RepairResult>[];
    })))
        .expand((x) => x);

    final successes = [
      for (final result in repairResults)
        if (result.success) result.package
    ];
    final failures = [
      for (final result in repairResults)
        if (!result.success) result.package
    ];

    if (successes.isNotEmpty) {
      var packages = pluralize('package', successes.length);
      log.message('Reinstalled ${log.green(successes.length)} $packages.');
    }

    if (failures.isNotEmpty) {
      var packages = pluralize('package', failures.length);
      var buffer = StringBuffer(
          'Failed to reinstall ${log.red(failures.length)} $packages:\n');

      for (var id in failures) {
        buffer.write('- ${log.bold(id.name)} ${id.version}');
        if (id.source != cache.sources.defaultSource) {
          buffer.write(' from ${id.source}');
        }
        buffer.writeln();
      }

      log.message(buffer.toString());
    }

    var globalRepairResults = await globals.repairActivatedPackages();
    if (globalRepairResults.first.isNotEmpty) {
      var packages = pluralize('package', globalRepairResults.first.length);
      log.message(
          'Reactivated ${log.green(globalRepairResults.first.length)} $packages.');
    }

    if (globalRepairResults.last.isNotEmpty) {
      var packages = pluralize('package', globalRepairResults.last.length);
      log.message(
          'Failed to reactivate ${log.red(globalRepairResults.last.length)} $packages:\n' +
              globalRepairResults.last
                  .map((name) => '- ${log.bold(name)}')
                  .join('\n'));
    }

    if (successes.isEmpty && failures.isEmpty) {
      log.message('No packages in cache, so nothing to repair.');
    }

    if (failures.isNotEmpty || globalRepairResults.last.isNotEmpty) {
      overrideExitCode(exit_codes.UNAVAILABLE);
    }
  }
}
