/**
 * @module HelperFunctions
 */

import stringify from 'json-stringify-pretty-compact'; // note: imported from a module

/**
 * add a cross browser event listener on a mouse scroll
 * @param {string} query DOM query of the element that the listener will be added to
 * @param {Function} func  Function that will be called when the event occurs. The function takes as a parameter an event object.
 */
export function addMouseScrollEventListener(query, func) {
    let MouseWheelHandler = event => {
        // redeclare for old IE support
        var event = window.event || event; // eslint-disable-line no-redeclare

        event.delta = Math.max(-1, Math.min(1, event.wheelDelta || -event.detail));

        func(event);

        return false;
    };

    let svgelement;

    // if the query is a simple DOM id selector, we can use getElementById which has better backwards compatibility
    if (query.match(/^#\w+$/)) {
        svgelement = document.getElementById(query.substr(1));
    } else {
        svgelement = document.querySelector(query);
    }

    if (svgelement.addEventListener) {
        // IE9, Chrome, Safari, Opera
        svgelement.addEventListener('mousewheel', MouseWheelHandler, false);
        // Firefox
        svgelement.addEventListener('DOMMouseScroll', MouseWheelHandler, false);
    } else {
        // IE 6/7/8
        svgelement.attachEvent('onmousewheel', MouseWheelHandler);
    }
    svgelement.addEventListener(
        'mousewheel',
        function(e) {
            console.log('event', e);
        },
        false
    );
}

/**
 * convert a data object to JSON string or to a data URI containing a JSON string
 * @param  {Object}  data            object that will be serialized into a JSON string
 * @param  {Boolean} [pretty=false]  if `true`, the code will be proprerly indented, else a more compact syntax will be used
 * @param  {Boolean} [dataUri=false] return dataUri containing the JSON string instead of the pure JSON string
 * @return {string}
 */
export function getJSONString(data, pretty = false, dataUri = false) {
    if (dataUri) {
        return (
            'data:application/json;charset=utf-8,' + encodeURIComponent(getJSONString(data, pretty))
        );
    } else {
        if (pretty) return stringify(data, { maxLength: 50 });

        return JSON.stringify(data);
    }
}

/**
 * returns the Manhattan distance between the points _a_ and _b_
 * @param  {Object} a object containing numeric attributes `x` and `y`
 * @param  {Object} b object containing numeric attributes `x` and `y`
 * @return {number}
 */
export function manhattanDistance(a, b) {
    return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
}