package com.opencloud.tenant.configuration;

import com.opencloud.tenant.datasource.DynamicDataSourceAspect;
import com.opencloud.tenant.datasource.DynamicDataSourceContextHolder;
import com.opencloud.tenant.datasource.DynamicRoutingDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: liuyadu
 * @date: 2019/3/20 13:20
 * @description:
 */
@Configuration
@EnableConfigurationProperties(value = {OpenTenantProperties.class})
public class DynamicDataSourceConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceConfiguration.class);


    @ConditionalOnProperty(value = "opencloud.tenant",matchIfMissing = true)
    @ConditionalOnMissingBean(DynamicDataSourceAspect.class)
    @Bean
    public DynamicDataSourceAspect dynamicDataSourceAspect(OpenTenantProperties openSaasProperties){
        logger.info("==> Current tenant is [{}]",openSaasProperties.getTenantId());
       return new DynamicDataSourceAspect(openSaasProperties);
    }

    @ConditionalOnProperty(value = "opencloud.tenant",matchIfMissing = true)
    @Bean("dynamicDataSource")
    public DataSource dynamicDataSource(DataSourceProperties dataSourceProperties,OpenTenantProperties openSaasProperties) {
        DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
        Map<Object, Object> dataSourceMap = new HashMap<>();
        if (dataSourceProperties != null) {
            // 默认数据源配置
            DataSourceBuilder builder = DataSourceBuilder.create().driverClassName(dataSourceProperties.getDriverClassName());
            builder.url(dataSourceProperties.getUrl());
            builder.username(dataSourceProperties.getUsername());
            builder.password(dataSourceProperties.getPassword());
            builder.type(dataSourceProperties.getType());
            dataSourceMap.put("master", builder.build());
        }

        if(openSaasProperties!=null){
            // 租户数据源配置
            DataSourceBuilder builder = DataSourceBuilder.create().driverClassName(openSaasProperties.getDatasource().getDriverClassName());
            builder.url(openSaasProperties.getDatasource().getUrl());
            builder.username(openSaasProperties.getDatasource().getUsername());
            builder.password(openSaasProperties.getDatasource().getPassword());
            builder.type(openSaasProperties.getDatasource().getType());
            dataSourceMap.put(openSaasProperties.getTenantId(),builder.build());
        }
        // 设置master 为默认数据源
        dynamicRoutingDataSource.setDefaultTargetDataSource(dataSourceMap.get("master"));
        // 可动态路由的数据源里装载了所有可以被路由的数据源
        dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
        // To put datasource keys into DataSourceContextHolder
        DynamicDataSourceContextHolder.dataSourceKeys.addAll(dataSourceMap.keySet());
        return dynamicRoutingDataSource;
    }

}