import * as utils from "./utils.js";
import './intersection-observer.polyfill.js';
import "intersection-observer";
const showedMapper = {};
function split(str, seprator) {
    return str.split(seprator);
}
/**
 *
 * @param {*} MO
 * @return {} pass
 */
function validateParam(param) {
    if (!param) {
        console.warn("参数MO不能为空，当前的参数为：", param);
        return false;
    }
    if (!param.dcm) {
        console.warn("dcm 必填。当前的参数为：", param);
        return false;
    }
    if (!param.dpm && !param.dom) {
        console.warn("dpm 和 dom 至少有一个。当前的参数为：", param);
        return false;
    }
    if (param.dpm && split(param.dpm, ".").length !== 4) {
        console.warn("dpm格式不正确。 当前的参数为：", param);
        return false;
    }
    if (param.dom && split(param.dom, ".").length !== 4) {
        console.warn("dom格式不正确。 当前的参数为：", param);
        return false;
    }
    if (split(param.dcm, ".").length !== 4) {
        console.warn("dcm格式不正确。 当前的参数为：", param);
        return false;
    }
    return true;
}
function doClickLog(data) {
    if (!validateParam(data)) {
        return;
    }
    const net = {
        name: "clickLog",
        uri: "/log/click",
        type: "get",
        dataType: "json",
        param: data,
        callback: null,
        hideMsg: true,
    };
    doAjax(net);
}
function registryIntersectionObserver(items) {
    items.forEach((item) => {
        if (typeof item.ele === 'string') {
            generatorShow(item);
        }
        else {
            item.ele.map(eleChild => generatorShow(Object.assign(Object.assign({}, item), { "ele": eleChild })));
        }
        // // 目标元素在dom中则处理
        // if (!!utils.getReference(item.ele)) {
        //   // 参数校验
        //   if (!item || !validateParam(item.data)) {
        //     return;
        //   }
        //   var observer = new IntersectionObserver(function (changes) {
        //     const { once = true, ele, data = {} } = item;
        //     changes.forEach((change) => {
        //       // 如果出现在页面中
        //       if (change.intersectionRatio > 0) {
        //         // 已经曝光过了
        //         if (showedMapper[ele]) {
        //           return;
        //         }
        //         showedMapper[ele] = true;
        //         observer.unobserve(change.target);
        //         const net = {
        //           name: "showLog",
        //           uri: data.domain + "/exposure/standard",
        //           type: "get",
        //           dataType: "jsonp",
        //           param: data,
        //           callback: null,
        //           hideMsg: true,
        //         };
        //         doAjax(net);
        //       } else {
        //         // 消失在视口
        //         if (!once) {
        //           // 如果需要曝光多次就移除
        //           showedMapper[ele] = false;
        //         }
        //       }
        //     });
        //   }, {});
        //   // 为目标元素注册IntersectionObserver
        //   let element = utils.getReference(item.ele);
        //   element && observer.observe(element);
        // }
    });
}
const generatorShow = (item) => {
    // 目标元素在dom中则处理
    if (!!utils.getReference(item.ele)) {
        // 参数校验
        if (!item || !validateParam(item.data)) {
            return;
        }
        var observer = new IntersectionObserver(function (changes) {
            const { once = true, ele, data = {} } = item;
            changes.forEach((change) => {
                // 如果出现在页面中
                if (change.intersectionRatio > 0) {
                    // 已经曝光过了
                    if (showedMapper[ele]) {
                        return;
                    }
                    showedMapper[ele] = true;
                    observer.unobserve(change.target);
                    const net = {
                        name: "showLog",
                        uri: data.domain + "/exposure/standard",
                        type: "get",
                        dataType: "jsonp",
                        param: data,
                        callback: null,
                        hideMsg: true,
                    };
                    doAjax(net);
                }
                else {
                    // 消失在视口
                    if (!once) {
                        // 如果需要曝光多次就移除
                        showedMapper[ele] = false;
                    }
                }
            });
        }, {});
        // 为目标元素注册IntersectionObserver
        let element = utils.getReference(item.ele);
        element && observer.observe(element);
    }
};
function doShowLog(items) {
    // 先注册一次
    registryIntersectionObserver(items);
    // 每次dom 插入节点的时候重新检测
    const observer = new MutationObserver(function () {
        registryIntersectionObserver(items);
    });
    observer.observe(document, { childList: true, subtree: true });
}
/**
 * 发送请求
 * @param net
 */
const doAjax = (net) => {
    let realUrl = net.uri;
    //url加参数等特殊需求（例如再玩一次需要在dostart接口的url上加埋点）
    if (net.addUrl) {
        realUrl += net.addUrl;
    }
    window["$"].ajax({
        type: net.type,
        url: realUrl,
        dataType: net.dataType,
        data: net.param,
        async: true,
        success: (result) => {
            console.log(`完成${net.name}${net.param}`);
        },
        error: (message) => { },
    });
};
const MD = {
    doClickLog: (data) => doClickLog(data),
    doShowLog: (items) => doShowLog(items),
};
export default MD;
