/**
 * ioredis客户端模块
 * @date 2022-03
 * @author 何华东
 */

import { logger } from "mslib";
import { Singleton } from "typescript-ioc";
import { getBasicConfig, getIORedisConfig } from "./Config";
import Contants from "./Contants";
const IORedis = require("ioredis");

/**
 * 测试环境配置
 */
const test_defaults = { host: 'r-bp1qmwd11yi1ujmfbq.redis.rds.aliyuncs.com', port: 6379, password: 'Keytop123', database: 50 };

/**
 * 正式环境配置
 */
const prod_defaults = { host: 'r-bp117e21a00ae2e4.redis.rds.aliyuncs.com', port: 6379, password: 'Keytop123', database: 111 };

/**
 * 默认配置，插件默认连接本机配置，可以不用配
 */
let defaults = {};

if (Contants.IS_PROD) defaults = prod_defaults;
else if (Contants.IS_TEST) defaults = test_defaults;

/**
 * ioredis配置
 */
export const config = Object.assign(defaults, getIORedisConfig(),
    {
        /**
            https://www.npmjs.com/package/ioredis
            默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
            将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
         */
        maxRetriesPerRequest: 0,
        lazyConnect: true,

        /**
            当 Redis 无法处理命令时（在ready事件之前发送），默认情况下将其添加到离线队列中，当它可以处理时执行。
            enableOfflineQueue 您可以通过将选项设置为来禁用此功能false
         */
        enableOfflineQueue: false
    });

/**
 * redis客户端实例
 * 
 * ioredis 实例
 */
export const redisClientInstance = new IORedis(config);

redisClientInstance.on("error", error => {
    if (error.code === 'ECONNREFUSED') return;
    logger.error(error);
});

/**
 * 缓存键
 */
export class CacheKey {
    /**
     * app已授权车场配置信息key
     */
    static readonly CONFIG_INFO = `${getBasicConfig().tapdId}_configInfo`;
}

/**
 * redis缓存服务
 */
@Singleton
export class CacheService {
    async getConfigInfo() {
        return await redisClientInstance.get(CacheKey.CONFIG_INFO);
    }

    async setConfigInfo(value) {
        return await redisClientInstance.set(CacheKey.CONFIG_INFO, JSON.stringify(value), 'ex', 60 * 60);
    }
}