package org.hbsp.cl.directory.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;

@Configuration
@PropertySource(value = {"classpath:properties/${env-name}/clauth-db.properties"})
public class PersistenceConfig {

    @Bean(name = {"lbeDataSource", "SU_LBE_DS"})
    @Lazy
    public DataSource lbeDataSource(
        @Value("${clauth.db.driverClass}") String driverClass,
        @Value("${clauth.db.url}") String url,
        @Value("${clauth.db.cl.username}") String username,
        @Value("${clauth.db.cl.password}") String password) {

        return createDataSource(driverClass, url, username, password);
    }

    @Bean(name = "dpsDataSource")
    @Lazy
    public DataSource dpsDataSource(
        @Value("${clauth.db.driverClass}") String driverClass,
        @Value("${clauth.db.url}") String url,
        @Value("${clauth.db.auth.username}") String username,
        @Value("${clauth.db.auth.password}") String password) {

        return createDataSource(driverClass, url, username, password);
    }

    @Bean(name = "EBSdataSource")
    @Lazy
    public DataSource ebsDataSource(
        @Value("${clauth.db.driverClass}") String driverClass,
        @Value("${clauth.db.url}") String url,
        @Value("${clauth.db.ebs.username}") String username,
        @Value("${clauth.db.ebs.password}") String password) {

        return createDataSource(driverClass, url, username, password);
    }

    @Bean(name = "OIDdataSource")
    @Lazy
    public DataSource oidDataSource(
        @Value("${clauth.db.driverClass}") String driverClass,
        @Value("${clauth.db.url}") String url,
        @Value("${clauth.db.oid.username}") String username,
        @Value("${clauth.db.oid.password}") String password) {

        return createDataSource(driverClass, url, username, password);
    }


    private DataSource createDataSource(String driverClass, String url, String username, String password) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName(driverClass);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setMaximumPoolSize(10);
        return new HikariDataSource(hikariConfig);
    }
}