var params = JSON.parse(value);

var request = new HttpRequest();

request.addHeader('X-Cisco-Meraki-API-Key:' + params.token);

var response,
    error_msg = '',
    vpnStats = [],
    result = [];

function getHttpData(url) {
    response = request.get(url);
    Zabbix.log(4, '[ Meraki API ] [ ' + url + ' ] Received response with status code ' + request.getStatus() + ': ' + response);

    if (response !== null) {
        try {
            response = JSON.parse(response);
        }
        catch (error) {
            throw 'Failed to parse response received from Meraki API. Check debug log for more information.';
        }
    }

    if (request.getStatus() !== 200) {
        if (response.errors) {
            throw response.errors.join(', ');
        } else {
            throw 'Failed to receive data: invalid response status code.';
        }
    }

    if (typeof (response) !== 'object' || response === null) {
        throw 'Cannot process response data: received data is not an object.';
    }

    return response;
};

try {

    if (params.token === '{' + '$MERAKI.TOKEN}') {
        throw 'Please change {' + '$MERAKI.TOKEN} macro with the proper value.';
    }

    if (params.url.indexOf('http://') === -1 && params.url.indexOf('https://') === -1) {
        params.url = 'https://' + params.url;
    }

    if (!params.url.endsWith('/')) {
        params.url += '/';
    }

    if (typeof params.httpproxy !==  'undefined' && params.httpproxy !== '') {
        request.setProxy(params.httpproxy);
    }

    vpnStats = getHttpData(params.url + 'organizations/' + encodeURIComponent(params.organizationId) + '/appliance/vpn/stats');

    for (i in vpnStats) {
        if (typeof vpnStats[i].merakiVpnPeers !== 'undefined' && Array.isArray(vpnStats[i].merakiVpnPeers)) {
            for (u in vpnStats[i].merakiVpnPeers) {
                if (typeof vpnStats[i].merakiVpnPeers[u].latencySummaries !== 'undefined' && Array.isArray(vpnStats[i].merakiVpnPeers[u].latencySummaries)) {
                    for (l in vpnStats[i].merakiVpnPeers[u].latencySummaries) {
                        result = vpnStats[i].merakiVpnPeers[u].latencySummaries.map(function (x) {

                            lps = vpnStats[i].merakiVpnPeers[u].lossPercentageSummaries.filter(function (y) { return y.senderUplink == x.senderUplink && y.receiverUplink == x.receiverUplink; });
                            js = vpnStats[i].merakiVpnPeers[u].jitterSummaries.filter(function (y) { return y.senderUplink == x.senderUplink && y.receiverUplink == x.receiverUplink; });
                            ms = vpnStats[i].merakiVpnPeers[u].mosSummaries.filter(function (y) { return y.senderUplink == x.senderUplink && y.receiverUplink == x.receiverUplink; });
                            Object.assign(x, lps[0], js[0], ms[0]);

                            if ('networkId' in vpnStats[i]) {
                                x.networkId = vpnStats[i].networkId;
                            }
                            if ('networkName' in vpnStats[i]) {
                                x.networkName = vpnStats[i].networkName;
                            }

                            if ('networkId' in vpnStats[i].merakiVpnPeers[u]) {
                                x.peerNetworkId = vpnStats[i].merakiVpnPeers[u].networkId;
                            }
                            if ('networkName' in vpnStats[i].merakiVpnPeers[u]) {
                                x.peerNetworkName = vpnStats[i].merakiVpnPeers[u].networkName;
                            }

                            return x;
                        });
                    }
                }
            }
        }
    }


} catch (error) {
    error_msg = error;
};

return JSON.stringify({
    'vpnStats': result,
    'error': error_msg.toString()
});