/* global APP, require */
/* jshint -W101 */
var EventEmitter = require("events");
var eventEmitter = new EventEmitter();
var CQEvents = require("../../service/connectionquality/CQEvents");
var XMPPEvents = require("../../service/xmpp/XMPPEvents");

/**
 * local stats
 * @type {{}}
 */
var stats = {};

/**
 * remote stats
 * @type {{}}
 */
var remoteStats = {};

/**
 * Interval for sending statistics to other participants
 * @type {null}
 */
var sendIntervalId = null;


/**
 * Start statistics sending.
 */
function startSendingStats() {
    sendStats();
    sendIntervalId = setInterval(sendStats, 10000);
}

/**
 * Sends statistics to other participants
 */
function sendStats() {
    APP.xmpp.addToPresence("connectionQuality", convertToMUCStats(stats));
}

/**
 * Converts statistics to format for sending through XMPP
 * @param stats the statistics
 * @returns {{bitrate_donwload: *, bitrate_uplpoad: *, packetLoss_total: *, packetLoss_download: *, packetLoss_upload: *}}
 */
function convertToMUCStats(stats) {
    return {
        "bitrate_download": stats.bitrate.download,
        "bitrate_upload": stats.bitrate.upload,
        "packetLoss_total": stats.packetLoss.total,
        "packetLoss_download": stats.packetLoss.download,
        "packetLoss_upload": stats.packetLoss.upload
    };
}

/**
 * Converts statistics to format used by VideoLayout
 * @param stats
 * @returns {{bitrate: {download: *, upload: *}, packetLoss: {total: *, download: *, upload: *}}}
 */
function parseMUCStats(stats) {
    return {
        bitrate: {
            download: stats.bitrate_download,
            upload: stats.bitrate_upload
        },
        packetLoss: {
            total: stats.packetLoss_total,
            download: stats.packetLoss_download,
            upload: stats.packetLoss_upload
        }
    };
}

var ConnectionQuality = {
    init: function () {
        APP.xmpp.addListener(XMPPEvents.REMOTE_STATS, this.updateRemoteStats);
        APP.statistics.addConnectionStatsListener(this.updateLocalStats);
        APP.statistics.addRemoteStatsStopListener(this.stopSendingStats);

    },

    /**
     * Updates the local statistics
     * @param data new statistics
     */
    updateLocalStats: function (data) {
        stats = data;
        eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, 100 - stats.packetLoss.total, stats);
        if (!sendIntervalId) {
            startSendingStats();
        }
    },

    /**
     * Updates remote statistics
     * @param jid the jid associated with the statistics
     * @param data the statistics
     */
    updateRemoteStats: function (jid, data) {
        if (!data || !data.packetLoss_total) {
            eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED, jid, null, null);
            return;
        }
        remoteStats[jid] = parseMUCStats(data);

        eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED,
            jid, 100 - data.packetLoss_total, remoteStats[jid]);
    },

    /**
     * Stops statistics sending.
     */
    stopSendingStats: function () {
        clearInterval(sendIntervalId);
        sendIntervalId = null;
        //notify UI about stopping statistics gathering
        eventEmitter.emit(CQEvents.STOP);
    },

    /**
     * Returns the local statistics.
     */
    getStats: function () {
        return stats;
    },
    
    addListener: function (type, listener) {
        eventEmitter.on(type, listener);
    }

};

module.exports = ConnectionQuality;