import 'dart:math';

import '../../async_core.dart';
import 'request.dart';
import 'session.dart';

/// Handler for spec related request building and response parsing.
///
/// For each type of request to WebDriver, there should be two sync methods,
///
///   1. WebDriverRequest buildSomeActionRequest(parameters)
///   2. ResponseType parseSomeActionResponse(WebDriverResponse)
///
/// So that spec related logic can be packed into such handlers without
/// concerning about how the requests are sent in low level.
///
/// Groups of such methods be packed into sub handlers like KeyboardHandler,
/// MouseHandler.
abstract class WebDriverHandler {
  SessionHandler get session;

  CoreHandler get core;

  KeyboardHandler get keyboard;

  MouseHandler get mouse;

  ElementFinder get elementFinder;

  ElementHandler get element;

  AlertHandler get alert;

  NavigationHandler get navigation;

  WindowHandler get window;

  FrameHandler get frame;

  CookiesHandler get cookies;

  TimeoutsHandler get timeouts;

  LogsHandler get logs;

  /// Builds general request to send to web driver server.
  WebDriverRequest buildGeneralRequest(HttpMethod method, String uri, [params]);

  /// Parses general response got from web driver server.
  dynamic parseGeneralResponse(
      WebDriverResponse response, dynamic Function(String) createElement);
}

abstract class SessionHandler {
  /// Builds request for 'Create Session'.
  WebDriverRequest buildCreateRequest({Map<String, dynamic>? desired});

  /// Parses response for 'Create Session'.
  SessionInfo parseCreateResponse(WebDriverResponse response);

  /// Builds request for 'Get Session Info'.
  WebDriverRequest buildInfoRequest(String id);

  /// Parses response for 'Get Session Info'.
  SessionInfo parseInfoResponse(WebDriverResponse response,
      [String? sessionId]);
}

abstract class CoreHandler {
  /// Builds request for 'Get Current URL'.
  WebDriverRequest buildCurrentUrlRequest();

  /// Parses response for 'Get Current URL'.
  String parseCurrentUrlResponse(WebDriverResponse response);

  /// Builds request for 'Get Title'.
  WebDriverRequest buildTitleRequest();

  /// Parses response for 'Get Title'.
  String parseTitleResponse(WebDriverResponse response);

  /// Builds request for 'Get Page Source'.
  WebDriverRequest buildPageSourceRequest();

  /// Parses response for 'Get Page Source'.
  String parsePageSourceResponse(WebDriverResponse response);

  /// Builds request for 'Take Screenshot'.
  WebDriverRequest buildScreenshotRequest();

  /// Builds request for 'Take Screenshot of Element'.
  WebDriverRequest buildElementScreenshotRequest(String elementId);

  /// Parses response for 'Take Screenshot' to get a base64 encoded image.
  String parseScreenshotResponse(WebDriverResponse response);

  /// Builds request for 'Execute Async Script'.
  WebDriverRequest buildExecuteAsyncRequest(String script, List args);

  /// Parses response for 'Execute Async Script'.
  dynamic parseExecuteAsyncResponse(
      WebDriverResponse response, dynamic Function(String) createElement);

  /// Builds request for 'Execute Script'.
  WebDriverRequest buildExecuteRequest(String script, List args);

  /// Parses response for 'Execute Script'.
  dynamic parseExecuteResponse(
      WebDriverResponse response, dynamic Function(String) createElement);

  /// Builds request for 'Delete Session'.
  WebDriverRequest buildDeleteSessionRequest();

  /// Parses response for 'Delete Session'.
  void parseDeleteSessionResponse(WebDriverResponse response);
}

abstract class ElementHandler {
  /// Builds request for 'Element Click'
  WebDriverRequest buildClickRequest(String elementId);

  /// Parses response for 'Element Click'.
  void parseClickResponse(WebDriverResponse response);

  /// Builds request for 'Element Send Keys'
  WebDriverRequest buildSendKeysRequest(String elementId, String keysToSend);

  /// Parses response for 'Element Send Keys'.
  void parseSendKeysResponse(WebDriverResponse response);

  /// Builds request for 'Element Clear'
  WebDriverRequest buildClearRequest(String elementId);

  /// Parses response for 'Element Clear'.
  void parseClearResponse(WebDriverResponse response);

  /// Builds request for 'Is Element Selected'.
  WebDriverRequest buildSelectedRequest(String elementId);

  /// Parses response for 'Is Element Selected'.
  bool parseSelectedResponse(WebDriverResponse response);

  /// Builds request for 'Is Element Enabled'.
  WebDriverRequest buildEnabledRequest(String elementId);

  /// Parses response for 'Is Element Enabled'.
  bool parseEnabledResponse(WebDriverResponse response);

  /// Builds request for 'Is Element Displayed'.
  WebDriverRequest buildDisplayedRequest(String elementId);

  /// Parses response for 'Is Element Displayed'.
  bool parseDisplayedResponse(WebDriverResponse response);

  /// Builds request for 'Element Location'.
  WebDriverRequest buildLocationRequest(String elementId);

  /// Parses response for 'Element Location'.
  Point<int> parseLocationResponse(WebDriverResponse response);

  /// Builds request for 'Element Size'.
  WebDriverRequest buildSizeRequest(String elementId);

  /// Parses response for 'Element Size'.
  ///
  /// This will be the rectangle moved to (0, 0).
  Rectangle<int> parseSizeResponse(WebDriverResponse response);

  /// Builds request for 'Element Name'.
  WebDriverRequest buildNameRequest(String elementId);

  /// Parses response for 'Element Name'.
  String parseNameResponse(WebDriverResponse response);

  /// Builds request for 'Element Text'.
  WebDriverRequest buildTextRequest(String elementId);

  /// Parses response for 'Element Text'.
  String parseTextResponse(WebDriverResponse response);

  /// Builds request for 'Element Attribute'.
  WebDriverRequest buildAttributeRequest(String elementId, String name);

  /// Parses response for 'Element Attribute'.
  String? parseAttributeResponse(WebDriverResponse response);

  /// Builds request for 'Selenium Element Attribute'.
  ///
  /// This is deprecated, only used to support old pageloader.
  @deprecated
  WebDriverRequest buildSeleniumAttributeRequest(String elementId, String name);

  /// Parses response for 'Element Attribute'.
  ///
  /// This is deprecated, only used to support old pageloader.
  @deprecated
  String? parseSeleniumAttributeResponse(WebDriverResponse response);

  /// Builds request for 'Element Property'.
  WebDriverRequest buildPropertyRequest(String elementId, String name);

  /// Parses response for 'Element Property'.
  String? parsePropertyResponse(WebDriverResponse response);

  /// Builds request for 'Element CSS Value'.
  WebDriverRequest buildCssPropertyRequest(String elementId, String name);

  /// Parses response for 'Element CSS Value'.
  String? parseCssPropertyResponse(WebDriverResponse response);
}

abstract class ElementFinder {
  /// Builds request for finding elements.
  WebDriverRequest buildFindElementsRequest(By by, [String? contextId]);

  /// Parses response got for finding elements to get [List] of element id.
  List<String> parseFindElementsResponse(WebDriverResponse response);

  /// Builds request for finding a single element.
  WebDriverRequest buildFindElementRequest(By by, [String? contextId]);

  /// Parses response got for finding element to get the element id.
  String parseFindElementResponse(WebDriverResponse response);

  /// Builds request for finding the current active element.
  WebDriverRequest buildFindActiveElementRequest();

  /// Parses response got for finding current active element to get the element
  /// id.
  String? parseFindActiveElementResponse(WebDriverResponse response);
}

abstract class KeyboardHandler {
  /// Builds request for sending chord.
  WebDriverRequest buildSendChordRequest(Iterable<String> chordToSend);

  /// Parses response got after sending chord.
  void parseSendChordResponse(WebDriverResponse response);

  /// Builds request for sending keys.
  WebDriverRequest buildSendKeysRequest(String keysToSend);

  /// Parses response got after sending keys.
  void parseSendKeysResponse(WebDriverResponse response);
}

abstract class MouseHandler {
  /// Builds request for 'Mouse Click'.
  WebDriverRequest buildClickRequest(
      [MouseButton button = MouseButton.primary]);

  /// Parses response for 'Mouse Click'.
  void parseClickResponse(WebDriverResponse response);

  /// Builds request for 'Mouse Down'.
  WebDriverRequest buildDownRequest([MouseButton button = MouseButton.primary]);

  /// Parses response for 'Mouse Down'.
  void parseDownResponse(WebDriverResponse response);

  /// Builds request for 'Mouse Up'.
  WebDriverRequest buildUpRequest([MouseButton button = MouseButton.primary]);

  /// Parses response for 'Mouse Up'.
  void parseUpResponse(WebDriverResponse response);

  /// Builds request for 'Mouse Double Click'.
  WebDriverRequest buildDoubleClickRequest();

  /// Parses response for 'Mouse Double Click'.
  void parseDoubleClickResponse(WebDriverResponse response);

  /// Builds request for 'Mouse Move To'.
  WebDriverRequest buildMoveToRequest(
      {String? elementId, int? xOffset, int? yOffset, bool absolute = false});

  /// Parses response for 'Mouse Move To'.
  void parseMoveToResponse(WebDriverResponse response);
}

abstract class AlertHandler {
  /// Builds request for 'Get Alert Text'.
  WebDriverRequest buildGetTextRequest();

  /// Parses response for 'Get Alert Text'.
  String parseGetTextResponse(WebDriverResponse response);

  /// Builds request for 'Accept Alert'.
  WebDriverRequest buildAcceptRequest();

  /// Parses response for 'Accept Alert'.
  void parseAcceptResponse(WebDriverResponse response);

  /// Builds request for 'Dismiss Alert'.
  WebDriverRequest buildDismissRequest();

  /// Parses response for 'Dismiss Alert'.
  void parseDismissResponse(WebDriverResponse response);

  /// Builds request for 'Send Alert Text'.
  WebDriverRequest buildSendTextRequest(String keysToSend);

  /// Parses response for 'Send Alert Text'.
  void parseSendTextResponse(WebDriverResponse response);
}

abstract class NavigationHandler {
  /// Builds request for 'Navigate To'.
  WebDriverRequest buildNavigateToRequest(String url);

  /// Parses response for 'Navigate To'.
  void parseNavigateToResponse(WebDriverResponse response);

  /// Builds request for 'Forward'.
  WebDriverRequest buildForwardRequest();

  /// Parses response for 'Forward'.
  void parseForwardResponse(WebDriverResponse response);

  /// Builds request for 'Back'.
  WebDriverRequest buildBackRequest();

  /// Parses response for 'Back'.
  void parseBackResponse(WebDriverResponse response);

  /// Builds request for 'Refresh'.
  WebDriverRequest buildRefreshRequest();

  /// Parses response for 'Refresh'.
  void parseRefreshResponse(WebDriverResponse response);
}

/// Handler for Window related functions.
///
/// Please note that except the top 3 APIs, all others are about the currently
/// active window.
abstract class WindowHandler {
  /// Builds request for 'Get Window Handles'.
  WebDriverRequest buildGetWindowsRequest();

  /// Parses response for 'Get Window Handles' to get window ids.
  List<String> parseGetWindowsResponse(WebDriverResponse response);

  /// Builds request for 'Get Window Handle'.
  WebDriverRequest buildGetActiveWindowRequest();

  /// Parses response for 'Get Window Handle' to get window id.
  String parseGetActiveWindowResponse(WebDriverResponse response);

  /// Builds request for 'Set Window Active'.
  WebDriverRequest buildSetActiveRequest(String windowId);

  /// Parses response for 'Set Window Active'.
  void parseSetActiveResponse(WebDriverResponse response);

  /// Builds request for 'Window Location'.
  WebDriverRequest buildLocationRequest();

  /// Parses response for 'Window Location'.
  Point<int> parseLocationResponse(WebDriverResponse response);

  /// Builds request for 'Window Size'.
  WebDriverRequest buildSizeRequest();

  /// Parses response for 'Window Size'.
  ///
  /// This will be the rectangle moved to (0, 0).
  Rectangle<int> parseSizeResponse(WebDriverResponse response);

  /// Builds request for 'Window Rect'.
  WebDriverRequest buildRectRequest();

  /// Parses response for 'Window Rect'.
  Rectangle<int> parseRectResponse(WebDriverResponse response);

  /// Builds request for 'Set Window Location'.
  WebDriverRequest buildSetLocationRequest(Point<int> location);

  /// Parses response for 'Set Window Location'.
  void parseSetLocationResponse(WebDriverResponse response);

  /// Builds request for 'Set Window Size'.
  WebDriverRequest buildSetSizeRequest(Rectangle<int> size);

  /// Parses response for 'Set Window Size'.
  void parseSetSizeResponse(WebDriverResponse response);

  /// Builds request for 'Set Window Rect'.
  WebDriverRequest buildSetRectRequest(Rectangle<int> rect);

  /// Parses response for 'Set Window Rect'.
  void parseSetRectResponse(WebDriverResponse response);

  /// Builds request for 'Maximize Window'.
  WebDriverRequest buildMaximizeRequest();

  /// Parses response for 'Maximize Window'.
  void parseMaximizeResponse(WebDriverResponse response);

  /// Builds request for 'Minimize Window'.
  ///
  /// Unsupported in JsonWire.
  WebDriverRequest buildMinimizeRequest();

  /// Parses response for 'Minimize Window'.
  ///
  /// Unsupported in JsonWire.
  void parseMinimizeResponse(WebDriverResponse response);

  /// Builds request for 'Close Window'.
  WebDriverRequest buildCloseRequest();

  /// Parses response for 'Close Window'.
  void parseCloseResponse(WebDriverResponse response);

  /// Builds request for 'Inner Size'.
  WebDriverRequest buildInnerSizeRequest();

  /// Parses response for 'Inner Size'.
  Rectangle<int> parseInnerSizeResponse(WebDriverResponse response);
}

abstract class FrameHandler {
  /// Builds request for 'Switch To Frame' with id.
  WebDriverRequest buildSwitchByIdRequest([int? id]);

  /// Parses response for 'Switch To Frame' with id.
  void parseSwitchByIdResponse(WebDriverResponse response);

  /// Builds request for 'Switch To Frame' with element.
  WebDriverRequest buildSwitchByElementRequest(String elementId);

  /// Parses response for 'Switch To Frame' with element.
  void parseSwitchByElementResponse(WebDriverResponse response);

  /// Builds request for 'Switch To Parent Frame'.
  WebDriverRequest buildSwitchToParentRequest();

  /// Parses response for 'Switch To Parent Frame'.
  void parseSwitchToParentResponse(WebDriverResponse response);
}

abstract class CookiesHandler {
  /// Builds request for 'Add Cookie'.
  WebDriverRequest buildAddCookieRequest(Cookie cookie);

  /// Parses response for 'Add Cookie'.
  void parseAddCookieResponse(WebDriverResponse response);

  /// Builds request for 'Delete Cookie'.
  WebDriverRequest buildDeleteCookieRequest(String name);

  /// Parses response for 'Delete Cookie'.
  void parseDeleteCookieResponse(WebDriverResponse response);

  /// Builds request for 'Delete All Cookies'.
  WebDriverRequest buildDeleteAllCookiesRequest();

  /// Parses response for 'Delete All Cookies'.
  void parseDeleteAllCookiesResponse(WebDriverResponse response);

  /// Builds request for 'Get Named Cookie'.
  WebDriverRequest buildGetCookieRequest(String name);

  /// Parses response for 'Get Named Cookie'.
  ///
  /// Also passing in [name] to work around missing this API in JsonWire.
  Cookie parseGetCookieResponse(WebDriverResponse response, String name);

  /// Builds request for 'Get All Cookies'.
  WebDriverRequest buildGetAllCookiesRequest();

  /// Parses response for 'Get All Cookies'.
  List<Cookie> parseGetAllCookiesResponse(WebDriverResponse response);
}

/// Handler for Timeouts.
///
/// We can potentially add support for getting timeouts (available in W3C).
/// But currently it's not requested.
abstract class TimeoutsHandler {
  /// Builds request for 'Set Script Timeout'.
  WebDriverRequest buildSetScriptTimeoutRequest(Duration timeout);

  /// Parses response for 'Set Script Timeout'.
  void parseSetScriptTimeoutResponse(WebDriverResponse response);

  /// Builds request for 'Set Implicit Timeout'.
  WebDriverRequest buildSetImplicitTimeoutRequest(Duration timeout);

  /// Parses response for 'Set Implicit Timeout'.
  void parseSetImplicitTimeoutResponse(WebDriverResponse response);

  /// Builds request for 'Set Page Load Timeout'.
  WebDriverRequest buildSetPageLoadTimeoutRequest(Duration timeout);

  /// Parses response for 'Set Page Load Timeout'.
  void parseSetPageLoadTimeoutResponse(WebDriverResponse response);
}

/// Handler for retrieving logs.
abstract class LogsHandler {
  /// Builds request for 'Get Logs'.
  WebDriverRequest buildGetLogsRequest(String logType);

  /// Parses response for 'Get Logs'.
  List<LogEntry> parseGetLogsResponse(WebDriverResponse response);
}
