import 'dart:math';

import 'package:webdriver/src/common/request.dart';
import 'package:webdriver/src/common/webdriver_handler.dart';

import 'utils.dart';

class W3cElementHandler extends ElementHandler {
  @override
  WebDriverRequest buildClickRequest(String elementId) {
    return WebDriverRequest.postRequest('${elementPrefix(elementId)}click');
  }

  @override
  void parseClickResponse(WebDriverResponse response) {
    parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend) {
    return WebDriverRequest.postRequest('${elementPrefix(elementId)}value', {
      'text': keysToSend, // What geckodriver really wants.
      'value': keysToSend // Actual W3C spec.
    });
  }

  @override
  void parseSendKeysResponse(WebDriverResponse response) {
    parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildClearRequest(String elementId) {
    return WebDriverRequest.postRequest('${elementPrefix(elementId)}clear');
  }

  @override
  void parseClearResponse(WebDriverResponse response) {
    parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildSelectedRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}selected');
  }

  @override
  bool parseSelectedResponse(WebDriverResponse response) {
    return parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildEnabledRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}enabled');
  }

  @override
  bool parseEnabledResponse(WebDriverResponse response) {
    return parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildDisplayedRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}displayed');
  }

  @override
  bool parseDisplayedResponse(WebDriverResponse response) {
    return parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildLocationRequest(String elementId) {
    return _buildRectRequest(elementId);
  }

  @override
  Point<int> parseLocationResponse(WebDriverResponse response) {
    return _parseRectResponse(response).topLeft;
  }

  @override
  WebDriverRequest buildSizeRequest(String elementId) {
    return _buildRectRequest(elementId);
  }

  @override
  Rectangle<int> parseSizeResponse(WebDriverResponse response) {
    final rect = _parseRectResponse(response);
    return Rectangle(0, 0, rect.width, rect.height);
  }

  WebDriverRequest _buildRectRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}rect');
  }

  Rectangle<int> _parseRectResponse(WebDriverResponse response) {
    final rect = parseW3cResponse(response);
    return Rectangle(rect['x'].toInt(), rect['y'].toInt(),
        rect['width'].toInt(), rect['height'].toInt());
  }

  @override
  WebDriverRequest buildNameRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}name');
  }

  @override
  String parseNameResponse(WebDriverResponse response) {
    return parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildTextRequest(String elementId) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}text');
  }

  @override
  String parseTextResponse(WebDriverResponse response) {
    return parseW3cResponse(response);
  }

  @override
  WebDriverRequest buildAttributeRequest(String elementId, String name) {
    return WebDriverRequest.getRequest(
        '${elementPrefix(elementId)}attribute/$name');
  }

  @override
  String? parseAttributeResponse(WebDriverResponse response) {
    return parseW3cResponse(response)?.toString();
  }

  @override
  @deprecated
  WebDriverRequest buildSeleniumAttributeRequest(
      String elementId, String name) {
    return WebDriverRequest.getRequest(
        '${elementPrefix(elementId)}attribute/$name');
  }

  @override
  @deprecated
  String? parseSeleniumAttributeResponse(WebDriverResponse response) {
    return parseW3cResponse(response)?.toString();
  }

  @override
  WebDriverRequest buildCssPropertyRequest(String elementId, String name) {
    return WebDriverRequest.getRequest('${elementPrefix(elementId)}css/$name');
  }

  @override
  String? parseCssPropertyResponse(WebDriverResponse response) {
    return parseW3cResponse(response)?.toString();
  }

  @override
  WebDriverRequest buildPropertyRequest(String elementId, String name) {
    return WebDriverRequest.getRequest(
        '${elementPrefix(elementId)}property/$name');
  }

  @override
  String? parsePropertyResponse(WebDriverResponse response) {
    return parseW3cResponse(response)?.toString();
  }
}
