// 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 '../flx.dart';
import '../globals.dart';
import '../runner/flutter_command.dart';

class RefreshCommand extends FlutterCommand {
  final String name = 'refresh';
  final String description = 'Build and deploy the Dart code in a Flutter app (Android only).';

  RefreshCommand() {
    argParser.addOption('target',
      abbr: 't',
      defaultsTo: defaultMainPath,
      help: 'Target app path / main entry-point file.'
    );
  }

  bool get androidOnly => true;

  bool get requiresDevice => true;

  @override
  Future<int> runInProject() async {
    printTrace('Downloading toolchain.');

    await Future.wait([
      downloadToolchain(),
      downloadApplicationPackagesAndConnectToDevices(),
    ], eagerError: true);

    if (devices.android == null || !devices.android.isConnected()) {
      printError('No device connected.');
      return 1;
    }

    Directory tempDir = await Directory.systemTemp.createTemp('flutter_tools');
    try {
      String snapshotPath = path.join(tempDir.path, 'snapshot_blob.bin');

      int result = await toolchain.compiler.compile(
          mainPath: argResults['target'], snapshotPath: snapshotPath
      );
      if (result != 0) {
        printError('Failed to run the Flutter compiler. Exit code: $result');
        return result;
      }

      bool success = await devices.android.refreshSnapshot(
          applicationPackages.android, snapshotPath
      );
      if (!success) {
        printError('Error refreshing snapshot on ${devices.android.name}.');
        return 1;
      }

      return 0;
    } finally {
      tempDir.deleteSync(recursive: true);
    }
  }
}
