var zxy = require('zxy-comm');
var _redisClient;
var outerror = true;
var outconn = true;

var runRedis = function (_redisConf) {
    _redisClient = require('redis').createClient(_redisConf);
    if (_redisConf.password) {
        _redisClient.auth(_redisConf.password);
    }
    if (_redisConf.database) {
        _redisClient.select(_redisConf.database);
    }
    if (!_redisClient.connected) {
        _redisClient.on("connect", function () {
            outerror = true;
            if (outconn) {
                outconn = false;
                if (zxy.app.v_singleCoreProcess) {
                    console.info("a single core process[" + process.pid + "] redis connected to", _redisConf.host, ":", _redisConf.port);
                }
            }
        });
    }
    _redisClient.on("error", function (err) {
        outconn = true;
        if (outerror) {
            outerror = false;
            console.error("redis connect error:", err.toString());
        }
    });
    //exports.client = _redisClient;
    // zxy.app.m_redis = this;
    return this;
}
exports.runRedis = runRedis;

//设置 time单位秒
var set = function (key, value, time) {
    if (time) {
        _redisClient.setex(key, time, value, function (err) {
            if (err) {
                console.error(err);
            }
        });
    }
    else {
        _redisClient.set(key, value, function (err) {
            if (err) {
                console.error(err);
            }
        });
    }
}
exports.set = set;

//获取
var get = function (key, callback) {
    _redisClient.get(key, function (err, reply) {
        if (err) {
            console.error(err);
            if (callback && typeof callback == 'function') {
                callback(undefined);
            }
        }
        else {
            if (callback && typeof callback == 'function') {
                callback(reply);
            }
        }
    });
}
exports.get = get;

//删除
var del = function (key) {
    get(key, function (r) {
        if (r) {
            _redisClient.del(key);
        }
    });
}
exports.del = del;

//keys
//pattern :
// * 匹配数据库中所有 key 。
// h?llo 匹配 hello ， hallo 和 hxllo 等。
// h*llo 匹配 hllo 和 heeeeello 等。
// h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo 。
var keys = function (pattern, callback) {
    if (!pattern) {
        pattern = "*";
    }
    _redisClient.keys(pattern, function (err, keys) {
        if (callback && typeof callback == 'function') {
            callback(keys);
        }
    });
}
exports.keys = keys;

//以秒为单位返回 key 的剩余生存时间 如果不存在key或者长期有效 返回-1
var ttl = function (key, callback) {
    _redisClient.ttl(key, function (err, time) {
        if (callback && typeof callback == 'function') {
            callback(time);
        }
    });
}
exports.ttl = ttl;

//是否存在key
var exists = function (key, callback) {
    _redisClient.exists(key, function (err, exists) {
        if (callback && typeof callback == 'function') {
            callback(exists ? true : false);
        }
    });
}
exports.exists = exists;

//将一个或多个值 value 插入到列表 key 的表尾(最右边)。
var rpush = function (key, value) {
    _redisClient.rpush(key, value);
}
exports.rpush = rpush;

//移除并返回列表 key 的头元素。
var lpop = function (key, callback) {
    _redisClient.lpop(key, function (err, value) {
        if (callback && typeof callback == 'function') {
            callback(value);
        }
    });
}
exports.lpop = lpop;