/**
 * 共享库配置模块
 * @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(async () => {
                     return {
                         host: this.reidsHost,
                         port: this.reidsPort,
                         password: this.reidsPwd,
                         database: this.reidsDB,
                     };
                 },
                     //可重试一分钟
                     1, 500,
                     {
                         retryCondition: (res) => {
                             logger.info(`充实条件：${JSON.stringify(res)}`);
                             return !!res.host;
                         }
                     });
 
                 resolve(res);
             } catch (error) {
                 reject('从配置中心获取redis配置失败');
             }
         });
     }
 }