// Copyright (c) 2013, 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.

library command_cache;

import 'dart:async';
import 'dart:io';
import 'dart:json' as json;

import 'exit_codes.dart' as exit_codes;
import 'log.dart' as log;
import 'pub.dart';


/// Handles the `cache` pub command.
class CacheCommand extends PubCommand { 
  String get description => "Inspect the system cache.";
  String get usage => 'pub cache list';
  bool get requiresEntrypoint => false;
  
  Future onRun() {
    if (commandOptions.rest.length != 1) {
      log.error('The cache command expects one argument.');
      this.printUsage();
      exit(exit_codes.USAGE);
    }
    
    if ((commandOptions.rest[0] != 'list')) {
      log.error('Unknown cache command "${commandOptions.rest[0]}".');
      this.printUsage();
      exit(exit_codes.USAGE);
    }
    
    // TODO(keertip): Add flag to list packages from non default sources
    return cache.sources.defaultSource.getCachedPackages().then((packages){
      var packagesObj = <String, Map>{};
      for (var package in packages){
        packagesObj[package.name] = {
          'version': package.version.toString(),
          'location': package.dir
        };
      }
      // TODO(keertip): Add support for non-JSON format 
      // and check for --format flag
      log.message( json.stringify({'packages': packagesObj}));
    });
  }  
}

