/**
 * 共享库配置模块
 * @date 2022-03
 * @author 何华东
 */

import { AxiosResponse } from 'axios';
import { Value } from 'mslib'
import { Singleton } from 'typescript-ioc';
import { retry } from './Decorators';
import { logger } from "mslib"

export interface Config {
    basic?: BasicConfig;

    /**
     * 国际化配置
     */
    global?: GlobalConfig;

    /**
     * 统一接口配置接口
     */
    tyApi?: TyApiConfig;

    /**
     * 非标接口配置
     */
    nonStandardApi?: NonStandardApiConfig;

    /**
     * cron定时任务配置
     */
    cron?: CronConfig;

    /**
     * ioredis配置
     */
    ioredis?: any;

    /**
     * ali-oss配置
     */
    aliOss?: any;

    /**
     * 车场镜像knex配置,参考knex/mysql
     */
    parkImageKnex?: any;
}

/**
 * 基础配置
 */
export interface BasicConfig {
    tapdId?: any;
}

/**
 * 国际化配置
 */
export interface GlobalConfig {
    /**
     * 是否启用国际化
     */
    enabled?: boolean;
}

/**
 * 统一接口配置接口
 */
export interface TyApiConfig {
    /**
     * 统一接口根地址
     * 
     * 默认根据环境变量自动配置
     */
    baseUrl?: string;

    /**
     * 请求超时时间(毫秒)
     * 
     * 默认为10000ms
     */
    timeout?: number;

    appId: string;
    appSecret: string;

    /**
     * 是否记录API调用日志
     * 
     * 默认为true
     */
    isLog?: boolean;
}

/**
 * 非标接口配置
 */
export interface NonStandardApiConfig {
    /**
     * 3des加密key
     */
    key?: string;

    /**
     * 3des加密偏移量
     */
    iv?: string;

    /**
     * 是否启用加解密
     */
    secure?: boolean;
}

/**
 * cron定时任务配置
 */
export interface CronConfig {
    /**
     * 是否启用定时任务
     */
    enabled?: boolean;
}

@Singleton
export class RedisConfigProvider {
    @Value('redis.host')
    reidsHost: string;
    @Value('redis.port')
    reidsPort: string;
    @Value('redis.db')
    reidsDB: string;
    @Value('redis.pwd')
    reidsPwd: string;

    getRedisConfig(): Promise<any> {
        return new Promise(async (resolve, reject) => {
            try {
                let res = await retry(() => {
                    throw '321';
                    return {
                        host: this.reidsHost,
                        port: this.reidsPort,
                        password: this.reidsPwd,
                        database: this.reidsDB,
                    };
                }, 1000 * 30 / 500, 500,
                    {
                        errorHandler: (error, retryLeft) => {
                            logger.error(`获取配置中心redis配置失败(${retryLeft})`, error);
                        },
                        retryCondition: (res) => {
                            return !res.host;
                        }
                    });

                resolve(res);
            } catch (error) {
                reject(`获取配置中心redis配置失败,${error}`);
            }
        });
    }
}