// Copyright 2013 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.

library observatory_sky_shell_launcher;

import 'dart:async';
import 'dart:convert';
import 'dart:io';

class ShellProcess {
  final Completer<Uri> _observatoryUriCompleter = Completer<Uri>();
  final Process _process;

  ShellProcess(this._process) {
    // Scan stdout and scrape the Observatory Uri.
    _process.stdout
        .transform(utf8.decoder)
        .transform(const LineSplitter())
        .listen((String line) {
      const String observatoryUriPrefix = 'Observatory listening on ';
      if (line.startsWith(observatoryUriPrefix)) {
        print(line);
        final Uri uri = Uri.parse(line.substring(observatoryUriPrefix.length));
        _observatoryUriCompleter.complete(uri);
      }
    });
  }

  Future<bool> kill() async {
    return _process.kill();
  }

  Future<Uri> waitForObservatory() async {
    return _observatoryUriCompleter.future;
  }
}

class ShellLauncher {
  final List<String> args = <String>[
    '--observatory-port=0',
    '--non-interactive',
    '--run-forever',
    '--disable-service-auth-codes',
  ];
  final String shellExecutablePath;
  final String mainDartPath;
  final bool startPaused;

  ShellLauncher(this.shellExecutablePath, this.mainDartPath, this.startPaused,
      List<String> extraArgs) {
    args.addAll(extraArgs);
    args.add(mainDartPath);
  }

  Future<ShellProcess?> launch() async {
    try {
      final List<String> shellArguments = <String>[];
      if (startPaused) {
        shellArguments.add('--start-paused');
      }
      shellArguments.addAll(args);
      print('Launching $shellExecutablePath $shellArguments');
      final Process process =
          await Process.start(shellExecutablePath, shellArguments);
      return ShellProcess(process);
    } catch (e) {
      print('Error launching shell: $e');
      return null;
    }
  }
}
