package com.nisum.Employeeinfo.config;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionFactoryOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.r2dbc.core.DatabaseClient;

import javax.sql.DataSource;
import java.sql.Driver;

import static io.r2dbc.spi.ConnectionFactoryOptions.*;


@Configuration
public class DataSourceConfiguration {

    private final Logger log = LoggerFactory.getLogger(DataSourceConfiguration.class);
    public static final String POOL = "pool";
    public static final String MYSQL = "mysql";


    @Bean
    public DataSource createDataSource(DataSourceProperties dataSourceProperties) {

        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/employeedb");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("root");


        return new HikariDataSource(hikariConfig);
    }

    @Bean
    public DataSourceTransactionManager createTransactionManager(DataSource dataSource) {

        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public ConnectionFactory createConnectionFactory(DataSourceProperties dataSourceProperties) {

        return ConnectionFactories.get(ConnectionFactoryOptions.builder()
                .option(DRIVER, POOL)
                .option(PROTOCOL, MYSQL)
                .option(HOST, dataSourceProperties.getHostName())
                .option(PORT, dataSourceProperties.getPort())
                .option(USER, dataSourceProperties.getUserName())
                .option(PASSWORD, dataSourceProperties.getPassword())
                .option(DATABASE, dataSourceProperties.getDatabaseName())
                .build());
    }

    @Bean
    public DatabaseClient createDataBaseClient(ConnectionFactory connectionFactory) {

        return DatabaseClient.create(connectionFactory);

    }

}