// Copyright 2014 The Flutter 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 '../base/common.dart';
import '../project.dart';
import '../runner/flutter_command.dart';

class MakeHostAppEditableCommand extends FlutterCommand {
  MakeHostAppEditableCommand() {
    requiresPubspecYaml();

    argParser.addFlag(
      'ios',
      help: "Whether to make this project's iOS app editable.",
      negatable: false,
    );
    argParser.addFlag(
      'android',
      help: "Whether ot make this project's Android app editable.",
      negatable: false,
    );
  }

  FlutterProject _project;

  @override
  final String name = 'make-host-app-editable';

  @override
  final String description = 'Moves host apps from generated directories to non-generated directories so that they can be edited by developers.\n\n'
    'Use flags to specify which host app to make editable. If no flags are provided then all host apps will be made editable.\n\n'
    'Once a host app is made editable, that host app cannot be regenerated by Flutter and it will not receive future template changes.';

  @override
  Future<void> validateCommand() async {
    await super.validateCommand();
    _project = FlutterProject.current();
    if (!_project.isModule) {
      throw ToolExit("Only projects created using 'flutter create -t module' can have their host apps made editable.");
    }
  }

  @override
  Future<FlutterCommandResult> runCommand() async {
    await _project.ensureReadyForPlatformSpecificTooling(checkProjects: false);

    final bool isAndroidRequested = boolArg('android');
    final bool isIOSRequested = boolArg('ios');

    if (isAndroidRequested == isIOSRequested) {
      // No flags provided, or both flags provided. Make Android and iOS host
      // apps editable.
      await _project.android.makeHostAppEditable();
      await _project.ios.makeHostAppEditable();
    } else if (isAndroidRequested) {
      await _project.android.makeHostAppEditable();
    } else if (isIOSRequested) {
      await _project.ios.makeHostAppEditable();
    }

    return FlutterCommandResult.success();
  }
}
