/**
 * Created by shihuayang on 7/16/2016.
 */
var EventEmitter = require('events').EventEmitter;
var util = require('util');
var pomelo = require('./pomelo-client.js');

var COS_CLIENT_VERSION = '0.2.0';

var PomeloClientProxy = function (opts) {
    EventEmitter.call(this);

    this.cosToken = "";
    this.lastMsgSeqId = 0;
    this.initCallback = null;
    this.heartbeatTimer = null;
    this.heartbeatInterval = 2000;
    this.heartbeatTimeoutTimes = 3;
    this.heartbeatTryTimes = 1;
    this.__realpomelo__ = new pomelo(opts);
};

util.inherits(PomeloClientProxy, EventEmitter);
module.exports = PomeloClientProxy;

var pomeloClientProxy = PomeloClientProxy.prototype;

pomeloClientProxy.init = function(params, cb) {
    var self = this;
    if(!!cb && typeof cb === 'function') {
        self.initCallback = cb;
    }

    this.__realpomelo__.on('error', function (msg) {
        if (!!self.heartbeatTimer) {
            clearInterval(self.heartbeatTimer);
            delete self.heartbeatTimer;
        }
    });

    this.__realpomelo__.on('close', function(msg){
        if (!!self.heartbeatTimer) {
            clearInterval(self.heartbeatTimer);
            delete self.heartbeatTimer;
        }
    });

    //pomelo.emit('processMessage', msg);
    this.__realpomelo__.on('processMessage', function (msg) {
        self.emit(msg.route, msg.body);
    });

    this.__realpomelo__.on('onKick', function (data) {
        self.emit('onKick', data);
    });

    this.__realpomelo__.init(params, function () {
        //内部handshake完成，开始走proxy的handshake
        var params = {
            cosVersion: COS_CLIENT_VERSION,
            cosSeq: self.lastMsgSeqId
        };

        if (self.cosToken.length > 0) {
            params.cosToken = self.cosToken;
        }

        var route = 'cos.connector.handshake';
        self.__realpomelo__.request(route, params, function(data) {
            onHandshake(self, data);
        });
    });
};

pomeloClientProxy.request = function(route, msg, cb) {
    var self = this;
    this.__realpomelo__.request(route, msg, function (body) {
        var cosSeq = body.cosSeq;
        if(!!cosSeq && cosSeq > self.lastMsgSeqId) {
            self.lastMsgSeqId = cosSeq;
        }

        cb(body);
    });
};

pomeloClientProxy.notify = function (route, msg) {
    this.__realpomelo__.notify(route, msg);
};

pomeloClientProxy.disconnect = function() {
    this.__realpomelo__.disconnect();
    if (!!this.heartbeatTimer) {
        clearInterval(this.heartbeatTimer);
        delete this.heartbeatTimer;
    }
};

var onHandshake = function (pomelo, data) {
    var code = data.code;
    if (code != 0) {
        if (code === 4) {
            console.log('Package version not match');
        } else if (code === 5) {
            console.log('Token not exist');
        }

        return;
    }

    pomelo.cosToken = data.cosToken;

    //注意：只所以初使化的回调在这里返回，是为了保证C-S连接全部完成之后，client才可以请求
    if(!!pomelo.initCallback && 'function' === typeof pomelo.initCallback) {
        heartbeat(pomelo, data);
        pomelo.initCallback();
    }
};

var heartbeat = function(pomelo, data) {
    if(!pomelo.heartbeatInterval) {
        // no heartbeat
        return;
    }

    if(!pomelo.heartbeatTimer) {
        pomelo.heartbeatTryTimes = 1;
        pomelo.heartbeatTimer = setInterval(function () {
            pomelo.heartbeatTryTimes++;

            if (pomelo.heartbeatTryTimes >= pomelo.heartbeatTimeoutTimes)
            {
                //console.info(, '');
                pomelo.__realpomelo__.disconnect();
            } else {
                var params = {
                    cosSeq: pomelo.lastMsgSeqId
                };

                var route = 'cos.connector.heartbeat';
                pomelo.__realpomelo__.request(route, params, function(data) {
                    onHeartbeat(pomelo, data);
                });
            }
        }, pomelo.heartbeatInterval);
    }
};

var onHeartbeat = function (pomelo, data) {
    pomelo.heartbeatTryTimes = 1;
};