// Copyright 2016 The Chromium 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 'dart:async';
import 'dart:io';

import 'package:path/path.dart' as path;

import '../base/utils.dart';
import '../globals.dart';
import '../runner/flutter_command.dart';

class ScreenshotCommand extends FlutterCommand {
  ScreenshotCommand() {
    argParser.addOption('out',
      abbr: 'o',
      help: 'Location to write the screenshot.');
  }

  @override
  String get name => 'screenshot';

  @override
  String get description => 'Take a screenshot from a connected device.';

  @override
  final List<String> aliases = <String>['pic'];

  @override
  bool get requiresProjectRoot => false;

  @override
  bool get requiresDevice => true;

  @override
  Future<int> runInProject() async {
    if (!deviceForCommand.supportsScreenshot) {
      printError('Screenshot not supported for ${deviceForCommand.name}.');
      return 1;
    }

    File outputFile;

    if (argResults.wasParsed('out')) {
      outputFile = new File(argResults['out']);
    } else {
      outputFile = getUniqueFile(Directory.current, 'flutter', 'png');
    }

    try {
      bool result = await deviceForCommand.takeScreenshot(outputFile);

      if (result) {
        int sizeKB = outputFile.lengthSync() ~/ 1000;
        printStatus('Screenshot written to ${path.relative(outputFile.path)} (${sizeKB}kb).');
        return 0;
      }
    } catch (error) {
      printError('Error taking screenshot: $error');
    }

    return 1;
  }
}
