package cn.ey.biz.module.external.api.datacenter.client;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.cloudapi.sdk.enums.Scheme;
import com.alibaba.dt.dataphin.client.ApiClient;
import com.alibaba.dt.dataphin.client.ApiClientBuilderParams;
import com.alibaba.fastjson.JSON;

import cn.ey.biz.module.external.api.datacenter.client.config.DataCenterConfig;
import cn.ey.biz.module.external.utils.SpringUtils;

public class DcRemoteCaller {
	
private static Logger log = LoggerFactory.getLogger(DcRemoteCaller.class);
	
	static DataCenterConfig dcConfig = SpringUtils.getObject(DataCenterConfig.class);
	
	/**
     * 客户端
     * <p>
     * 线程安全，可复用。volatile：禁止指令重排，配合DCL，详见 getClient()
     */
    private volatile static ApiClient timeSheetApiClient;
    
    private volatile static ApiClient engagementApiClient;
    
    private volatile static ApiClient pcolibApiClient;
    
    private volatile static ApiClient contractApiClient;
    
    public static ApiClient getTimeSheetApiClient() {
        if (timeSheetApiClient == null) {
            synchronized (DcRemoteCaller.class) {
                if (timeSheetApiClient == null) {
                    //初始化客戶端
                    ApiClientBuilderParams params = new ApiClientBuilderParams();
                    params.setAppKey(dcConfig.getTimeSheetAppKey());
                    params.setAppSecret(dcConfig.getTimeSheetAppSecret());
                    //访问服务的域名
                    params.setHost(dcConfig.getHost());
                    //默认为http协议, 可设置https协议(os网关不支持https!!，非os网关可以支持https，具体决定于所调用的API）
                    params.setScheme(Scheme.HTTPS);
                    //stage 默认访问的是生产环境的API， 可设置访问开发环境的API
                    params.setStage(dcConfig.getFirstEnv());
                    // 如果使用二级域名或未指定环境的独立域名，需要设置env， 默认访问生产环境
                    // 如果已经指定了访问环境的独立域名，则env参数不会起作用
                    params.setEnv(dcConfig.getSecondEnv());
                    log.info("初始化数据中台服务工时客户端.............................................................");
                    log.info(JSON.toJSONString(params));
                    timeSheetApiClient = new ApiClient(params);
                    log.info("数据中台服务工时客户端初始化成功");
                   return timeSheetApiClient;
                }
            }
        }
        return timeSheetApiClient;
    }
    
    public static ApiClient getEngagementApiClient() {
        if (engagementApiClient == null) {
            synchronized (DcRemoteCaller.class) {
                if (engagementApiClient == null) {
                    //初始化客戶端
                    ApiClientBuilderParams params = new ApiClientBuilderParams();
                    params.setAppKey(dcConfig.getEngagementAppKey());
                    params.setAppSecret(dcConfig.getEngagementAppSecret());
                    //访问服务的域名
                    params.setHost(dcConfig.getHost());
                    //默认为http协议, 可设置https协议(os网关不支持https!!，非os网关可以支持https，具体决定于所调用的API）
                    params.setScheme(Scheme.HTTPS);
                    //stage 默认访问的是生产环境的API， 可设置访问开发环境的API
                    params.setStage(dcConfig.getFirstEnv());
                    // 如果使用二级域名或未指定环境的独立域名，需要设置env， 默认访问生产环境
                    // 如果已经指定了访问环境的独立域名，则env参数不会起作用
                    params.setEnv(dcConfig.getSecondEnv());
                    log.info("初始化数据中台服务项目客户端.............................................................");
                    log.info(JSON.toJSONString(params));
                    engagementApiClient = new ApiClient(params);
                    log.info("数据中台服务项目客户端客户端初始化成功");
                   return engagementApiClient;
                }
            }
        }
        return engagementApiClient;
    }
    
    public static ApiClient getPcolibApiClient() {
        if (pcolibApiClient == null) {
            synchronized (DcRemoteCaller.class) {
                if (pcolibApiClient == null) {
                    //初始化客戶端
                    ApiClientBuilderParams params = new ApiClientBuilderParams();
                    params.setAppKey(dcConfig.getPcolibAppKey());
                    params.setAppSecret(dcConfig.getPcolibAppSecret());
                    //访问服务的域名
                    params.setHost(dcConfig.getHost());
                    //默认为http协议, 可设置https协议(os网关不支持https!!，非os网关可以支持https，具体决定于所调用的API）
                    params.setScheme(Scheme.HTTPS);
                    //stage 默认访问的是生产环境的API， 可设置访问开发环境的API
                    params.setStage(dcConfig.getFirstEnv());
                    // 如果使用二级域名或未指定环境的独立域名，需要设置env， 默认访问生产环境
                    // 如果已经指定了访问环境的独立域名，则env参数不会起作用
                    params.setEnv(dcConfig.getSecondEnv());
                    log.info("初始化数据中台服务公共码库客户端.............................................................");
                    log.info(JSON.toJSONString(params));
                    pcolibApiClient = new ApiClient(params);
                    log.info("数据中台服务公共码库客户端客户端初始化成功");
                   return pcolibApiClient;
                }
            }
        }
        return pcolibApiClient;
    }
    
    
    public static ApiClient getContractApiClient() {
        if (contractApiClient == null) {
            synchronized (DcRemoteCaller.class) {
                if (contractApiClient == null) {
                    //初始化客戶端
                    ApiClientBuilderParams params = new ApiClientBuilderParams();
                    params.setAppKey(dcConfig.getContractAppKey());
                    params.setAppSecret(dcConfig.getContractAppSecret());
                    //访问服务的域名
                    params.setHost(dcConfig.getHost());
                    //默认为http协议, 可设置https协议(os网关不支持https!!，非os网关可以支持https，具体决定于所调用的API）
                    params.setScheme(Scheme.HTTPS);
                    //stage 默认访问的是生产环境的API， 可设置访问开发环境的API
                    params.setStage(dcConfig.getFirstEnv());
                    // 如果使用二级域名或未指定环境的独立域名，需要设置env， 默认访问生产环境
                    // 如果已经指定了访问环境的独立域名，则env参数不会起作用
                    params.setEnv(dcConfig.getSecondEnv());
                    log.info("初始化数据中台服务合同客户端.............................................................");
                    log.info(JSON.toJSONString(params));
                    contractApiClient = new ApiClient(params);
                    log.info("数据中台服务合同客户端客户端初始化成功");
                   return contractApiClient;
                }
            }
        }
        return contractApiClient;
    }
    
    
    
}
