"use strict";

var console      = require('gifer-console');
var oscar        = require('./oscar');
// var crashHandler = require('domain').create();
// var EventEmitter = require('events');

var icqBot  = null;

function ICQ(_debug) {
    var Self            = this;
    var connectionsList = {}; // { UIN: aim }
    var USER_STATUSES   = oscar.USER_STATUSES;

    _debug = !!_debug;

        // ======================================================
    // 1) SN_ подключить пользователя (возможно отдельно - проверить подключение)
    // 2) SN_ отправить сообщение пользователю ICQ
    // 3) NS_ пришло сообщение от пользователя ICQ (привязано к определенному пользователю чата)
    // 4) SN_ завершить/отключить пользователя
    // 5) SN_ запрос списка контактов
    // 6) NS_ список контактов подключенного пользователя

    this.createIcqConnection = function (UIN, ICQ, PWD, cb) {
        if (connectionsList.hasOwnProperty(UIN)){
            Self.disconnect(UIN, true);
        } else {
            connectionsList[UIN] = {
                uin: UIN,
                icq: ICQ,
                pwd: PWD
            };

            connectionsList[UIN].aim = new oscar.OscarConnection({
                connection: {
                    username : ICQ.toString(),
                    password : PWD,
                    debug    : _debug
                },
                other: {
                    initialStatus: USER_STATUSES.ONLINE
                }
            });

            if (typeof cb === "function"){
                cb(connectionsList[UIN], oscar.CONST);
            }
            // handleEvents(connectionsList[UIN].aim);

            connectionsList[UIN].aim.connect(function(err) {
                if (err){
                    console.err('[ ICQ ]: ERROR. ' + err, console.logLevel.ERROR);
                }

                // console.log(connectionsList[UIN].aim.me);
            });

        }
    };

    this.disconnect = function (UIN, reconnect) {
        if (connectionsList.hasOwnProperty(UIN)){
            try {
                connectionsList[UIN].aim.end(function () {
                    console.log('[ ICQ ]: Disconnected!');
                    var icq = connectionsList[UIN].icq;
                    var pwd = connectionsList[UIN].pwd;

                    delete connectionsList[UIN];

                    if (reconnect){
                        Self.createIcqConnection(icq, pwd);
                    }
                });
            } catch (e){
                console.err(e.message, console.logLevel.ERROR);
                console.err(e.stack, console.logLevel.ERROR);
            }
        } else {

        }
    };

    this.getOfflineMessenger = function (UIN) {
        if (connectionsList.hasOwnProperty(UIN)){
            connectionsList[UIN].aim.getOfflineMsgs();
        }
    };

    this.sendMessage = function (UIN, ICQ, MSG) {
        if (connectionsList.hasOwnProperty(UIN)){
            connectionsList[UIN].aim.sendIM(ICQ, MSG.toString());
        }
    };

    this.destroyAll = function () {
        connectionsList = null;
    };

    // this.start = function () {
    //     this.emit('started');
    // };
    //
    // EventEmitter.call(this);
}

// require('util').inherits(ICQ, EventEmitter);

exports.ICQ = function (debug) {
    // crashHandler.run(function () {
        icqBot = new ICQ(debug);
    // });
    //
    // crashHandler.on('error', function(err) {
    //     console.immediately(err.stack);
    //
    //     if (icqBot.destroyAll) {
    //         icqBot.destroyAll();
    //     }
    //
    //     icqBot.emit('criticalError', err);
    //
    //     icqBot = null;
    // });

    return icqBot;
};