// 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 'device.dart';

/// Discover service protocol ports on devices.
class ServiceProtocolDiscovery {
  /// [logReader] A [DeviceLogReader] to look for Observatory messages in.
  ServiceProtocolDiscovery(DeviceLogReader logReader)
      : _logReader = logReader {
    assert(_logReader != null);
    if (!_logReader.isReading)
      _logReader.start();

    _logReader.lines.listen(_onLine);
  }

  final DeviceLogReader _logReader;
  Completer<int> _completer = new Completer<int>();

  /// The [Future] returned by this function will complete when the next service
  /// protocol port is found.
  Future<int> nextPort() => _completer.future;

  void _onLine(String line) {
    int portNumber = 0;
    if (line.contains('Observatory listening on http://')) {
      try {
        RegExp portExp = new RegExp(r"\d+.\d+.\d+.\d+:(\d+)");
        String port = portExp.firstMatch(line).group(1);
        portNumber = int.parse(port);
      } catch (_) {
        // Ignore errors.
      }
    }
    if (portNumber != 0)
      _located(portNumber);
  }

  void _located(int port) {
    assert(_completer != null);
    assert(!_completer.isCompleted);
    _completer.complete(port);
    _completer = new Completer<int>();
  }
}