/**
 * 共享库配置模块
 * 
 * 抽象了共享库依赖的配置接口
 * 
 * 上层应用需要将配置信息注册到typescript-ioc中，共享库就可以从中读取
 * @date 2022-03
 * @author 何华东
 */

import { Container } from "typescript-ioc";

/**
 * 配置接口
 */
export interface Config {
    basic: BasicConfig;
    uniteApi: UniteApiConfig;
    nonStandardApi?: NonStandardApiConfig;
    prestoClient?: PrestoClientConfig;
    parkImageKnex?: ParkImageKnexConfig;
    aliOss?: AliOssConfig;
}

/**
 * 基础配置
 */
export interface BasicConfig {
    /**
     * 中台项目id
     */
    projectId: any;

    /**
     * tapd id
     */
    tapdId: any

    appName?: string;
}

/**
 * 统一API配置
 */
export interface UniteApiConfig {
    /**
     * 统一API根地址
     * 
     * 默认按照配置的node环境自动配置
     */
    baseUrl?: string;

    /**
     * 统一API请求超时时间
     * 
     * 默认为10秒
     */
    timeout?: number;

    /**
     * appId
     */
    appId: any;

    /**
     * appSecret
     */
    appSecret: string;

    /**
     * axios请求异常处理
     * 
     * 默认将异常转为ApiError并抛出
     */
    axiosErrorHandler?: (error) => void;
}

/**
 * 非标API配置
 */
export interface NonStandardApiConfig {
    /**
     * 非标3des加解密配置
     */
    des3?: {
        key: string,
        iv: string
    },
    /**
     * ioredis缓存配置
     */
    ioredis?: {
        host: string,
        port: number,
        password: string,
        database: number,
        /**
          https://www.npmjs.com/package/ioredis
          默认情况下，每重试 20 次，所有挂起的命令都会被刷新并显示一个错误。这样可以确保在连接断开时命令不会永远等待。
          将 maxRetriesPerRequest 设置null为禁用此行为，并且每个命令将永远等待，直到连接再次处于活动状态（这是 ioredis v4 之前的默认行为）。
          */
        maxRetriesPerRequest: number,

        /**
         当 Redis 无法处理命令时（在ready事件之前发送），默认情况下将其添加到离线队列中，当它可以处理时执行。
         enableOfflineQueue 您可以通过将选项设置为来禁用此功能false
         */
        enableOfflineQueue: boolean,
        /**
         * 当第一个命令到达时才会连接服务器
         */
        lazyConnect: boolean

        //参考ioredis其他参数...
    }
}

/**
 * 数据湖PrestoClient客户端配置
 */
export interface PrestoClientConfig {
    host: string;
    port: string;
    user: string;
}

/**
 * 镜像车场库knex配置
 */
export interface ParkImageKnexConfig {
    connection?: {
        host: string;
        port: number,
        user: string;
        password: string;
        database: string;
    }

    //其他Knex配置...
}

/**
 * ali-oss配置
 */
export class AliOssConfig{ 

}

/**
 * 获取所有配置
 * @returns 
 */
export function getConfig(): Config {
    return Container.getValue('config');
}

/**
 * 获取基础配置
 * @returns 
 */
export function getBasicConfig(): BasicConfig {
    return Container.getValue('config.basic');
}

/**
 * 获取统一API配置
 * @returns 
 */
export function getUniteApiConfig(): UniteApiConfig {
    return Container.getValue('config.uniteApi');
}

/**
 * 获取非标API配置
 * @returns 
 */
export function getNonStandardApiConfig(): NonStandardApiConfig {
    return Container.getValue('config.nonStandardApi');
}

/**
 * 获取数据湖配置
 * @returns 
 */
export function getPrestoClientConfig(): PrestoClientConfig {
    return Container.getValue('config.prestoClient');
}

/**
 * 获取镜像车场配置
 * @returns 
 */
export function getParkImageKnexConfig(): ParkImageKnexConfig {
    return Container.getValue('config.parkImageKnex');
}

/**
 * 获取ali-oss配置
 * @returns 
 */
 export function getAliOssConfig(): AliOssConfig {
    return Container.getValue('config.aliOss');
}