import io from 'socket.io';
import Socket from 'socket.io/lib/socket';
import * as Metrics from './metrics/metrics';
import { JSONFileMetricsReporter } from './metrics/jsonfilemetricsreporter';

const LOGGER = require('@calzoneman/jsli')('counters');

var counters = {};
var server = null;

exports.add = Metrics.incCounter;

Socket.prototype._packet = Socket.prototype.packet;
Socket.prototype.packet = function () {
    this._packet.apply(this, arguments);
    exports.add('socket.io:packet');
};

function getConnectedSockets() {
    var sockets = io.instance.sockets.sockets;
    if (typeof sockets.length === 'number') {
        return sockets.length;
    } else {
        return Object.keys(sockets).length;
    }
}

function setChannelCounts(metrics) {
    if (server === null) {
        server = require('./server').getServer();
    }

    try {
        var publicCount = 0;
        var allCount = 0;
        server.channels.forEach(function (c) {
            allCount++;
            if (c.modules.options && c.modules.options.get("show_public")) {
                publicCount++;
            }
        });

        metrics.addProperty('channelCount:all', allCount);
        metrics.addProperty('channelCount:public', publicCount);
    } catch (error) {
        LOGGER.error(error.stack);
    }
}

const reporter = new JSONFileMetricsReporter('counters.log');
Metrics.setReporter(reporter);
Metrics.setReportInterval(60000);
Metrics.addReportHook((metrics) => {
    metrics.addProperty('socket.io:count', getConnectedSockets());
    setChannelCounts(metrics);
});
