//
//  FindElementsAtPointJS.swift
//  flutter_inappwebview
//
//  Created by Lorenzo Pichilli on 16/02/21.
//

import Foundation

let FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT_GROUP_NAME = "IN_APP_WEBVIEW_FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT"

let FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT = PluginScript(
    groupName: FIND_ELEMENTS_AT_POINT_JS_PLUGIN_SCRIPT_GROUP_NAME,
    source: FIND_ELEMENTS_AT_POINT_JS_SOURCE,
    injectionTime: .atDocumentStart,
    forMainFrameOnly: true,
    requiredInAllContentWorlds: false,
    messageHandlerNames: [])

/**
 https://developer.android.com/reference/android/webkit/WebView.HitTestResult
 */
let FIND_ELEMENTS_AT_POINT_JS_SOURCE = """
window.\(JAVASCRIPT_BRIDGE_NAME)._findElementsAtPoint = function(x, y) {
    var hitTestResultType = {
        UNKNOWN_TYPE: 0,
        PHONE_TYPE: 2,
        GEO_TYPE: 3,
        EMAIL_TYPE: 4,
        IMAGE_TYPE: 5,
        SRC_ANCHOR_TYPE: 7,
        SRC_IMAGE_ANCHOR_TYPE: 8,
        EDIT_TEXT_TYPE: 9
    };
    var element = document.elementFromPoint(x, y);
    var data = {
        type: 0,
        extra: null
    };
    while (element) {
        if (element.tagName === 'IMG' && element.src) {
            if (element.parentNode && element.parentNode.tagName === 'A' && element.parentNode.href) {
                data.type = hitTestResultType.SRC_IMAGE_ANCHOR_TYPE;
            } else {
                data.type = hitTestResultType.IMAGE_TYPE;
            }
            data.extra = element.src;
            break;
        } else if (element.tagName === 'A' && element.href) {
            if (element.href.indexOf('mailto:') === 0) {
                data.type = hitTestResultType.EMAIL_TYPE;
                data.extra = element.href.replace('mailto:', '');
            } else if (element.href.indexOf('tel:') === 0) {
                data.type = hitTestResultType.PHONE_TYPE;
                data.extra = element.href.replace('tel:', '');
            } else if (element.href.indexOf('geo:') === 0) {
                data.type = hitTestResultType.GEO_TYPE;
                data.extra = element.href.replace('geo:', '');
            } else {
                data.type = hitTestResultType.SRC_ANCHOR_TYPE;
                data.extra = element.href;
            }
            break;
        } else if (
            (element.tagName === 'INPUT' && ['text', 'email', 'password', 'number', 'search', 'tel', 'url'].indexOf(element.type) >= 0) ||
            element.tagName === 'TEXTAREA') {
            data.type = hitTestResultType.EDIT_TEXT_TYPE
        }
        element = element.parentNode;
    }
    return data;
}
"""