// 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 '../exceptions.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) {
      throw ExitWithException(exit_codes.UNAVAILABLE);
    }
  }
}
