// Copyright 2018 Google. 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 '../webkit_inspection_protocol.dart';

class WipTarget extends WipDomain {
  WipTarget(WipConnection connection) : super(connection);

  /// Creates a new page.
  ///
  /// [url] The initial URL the page will be navigated to.
  ///
  /// Returns the targetId of the page opened.
  Future<String> createTarget(String url) async {
    WipResponse response =
        await sendCommand('Target.createTarget', params: {'url': url});
    return response.result['targetId'] as String;
  }

  /// Activates (focuses) the target.
  Future activateTarget(String targetId) =>
      sendCommand('Target.activateTarget', params: {'targetId': targetId});

  /// Closes the target. If the target is a page that gets closed too.
  ///
  /// Returns `true` on success.
  Future<bool> closeTarget(String targetId) async {
    WipResponse response =
        await sendCommand('Target.closeTarget', params: {'targetId': targetId});
    return response.result['success'] as bool;
  }

  /// Inject object to the target's main frame that provides a communication
  /// channel with browser target. Injected object will be available as
  /// `window[bindingName]`. The object has the following API:
  ///
  ///  - binding.send(json) - a method to send messages over the remote
  ///    debugging protocol
  ///  - binding.onmessage = json => handleMessage(json) - a callback that will
  ///    be called for the protocol notifications and command responses.
  @experimental
  Future<void> exposeDevToolsProtocol(
    String targetId, {
    String bindingName,
  }) async {
    final Map<String, dynamic> params = {'targetId': targetId};
    if (bindingName != null) {
      params['bindingName'] = bindingName;
    }
    final WipResponse response = await sendCommand(
      'Target.exposeDevToolsProtocol',
      params: params,
    );
    dynamic foo = await response.result['targetId'];
    print(foo);
  }
}
