import 'dart:async';
import 'dart:convert';
import 'dart:io' show ContentType, HttpClient, HttpHeaders, HttpClientRequest;

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

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

/// Async request client using dart:io package.
class AsyncIoRequestClient extends AsyncRequestClient {
  final HttpClient client = HttpClient();
  final Map<String, String> _headers;

  final Lock _lock = Lock();

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

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

    switch (request.method) {
      case HttpMethod.httpGet:
        httpRequest = await client.getUrl(resolve(request.uri!));
        break;
      case HttpMethod.httpPost:
        httpRequest = await client.postUrl(resolve(request.uri!));
        break;
      case HttpMethod.httpDelete:
        httpRequest = await client.deleteUrl(resolve(request.uri!));
        break;
    }

    httpRequest.followRedirects = true;
    _headers.forEach(httpRequest.headers.add);
    httpRequest.headers.add(HttpHeaders.acceptHeader, 'application/json');
    httpRequest.headers.add(HttpHeaders.acceptCharsetHeader, utf8.name);
    httpRequest.headers.add(HttpHeaders.cacheControlHeader, 'no-cache');

    if (request.body != null && request.body!.isNotEmpty) {
      httpRequest.headers.contentType =
          ContentType('application', 'json', charset: 'utf-8');
      final body = utf8.encode(request.body!);
      httpRequest.contentLength = body.length;
      httpRequest.add(body);
    }

    try {
      final response = await httpRequest.close();

      return WebDriverResponse(response.statusCode, response.reasonPhrase,
          await utf8.decodeStream(response.cast<List<int>>()));
    } finally {
      _lock.release();
    }
  }

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