import 'dart:async';
import 'dart:html';

import 'package:webdriver/support/async.dart';

import '../common/request.dart';
import '../common/request_client.dart';

/// Async request client using dart:html package.
///
/// On the low level, it's using XMLHttpRequest object (XHR).
class AsyncXhrRequestClient extends AsyncRequestClient {
  final Lock _lock = Lock();
  final Map<String, String> _headers;

  AsyncXhrRequestClient(Uri prefix, {Map<String, String> headers = const {}})
      : _headers = headers,
        super(prefix);

  @override
  Future<WebDriverResponse> sendRaw(WebDriverRequest request) async {
    await _lock.acquire();

    final headers = {
      'Accept': 'application/json',
    };

    headers.addAll(_headers);

    HttpRequest httpRequest;

    try {
      httpRequest = await HttpRequest.request(resolve(request.uri).toString(),
          method: request.method.name,
          requestHeaders: headers,
          sendData: request.body,
          mimeType: 'application/json');
    } on ProgressEvent catch (e) {
      httpRequest = e.target;
    } finally {
      _lock.release();
    }

    return WebDriverResponse(
        httpRequest.status, httpRequest.statusText, httpRequest.response);
  }

  @override
  String toString() => 'AsyncXhr';
}
