package cn.elvea.platform.config;

import cn.elvea.platform.commons.Context;
import cn.elvea.platform.commons.persistence.jdbc.auditor.UserAuditorAware;
import cn.elvea.platform.commons.persistence.jdbc.converter.BooleanToIntegerConverter;
import cn.elvea.platform.commons.persistence.jdbc.converter.IntegerToBooleanConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import javax.sql.DataSource;
import java.util.Arrays;

/**
 * JdbcConfig
 *
 * @author elvea
 */
@Slf4j
@Configuration
@EnableJdbcAuditing
@EnableJdbcRepositories("cn.elvea.platform.core.**.repository")
public class JdbcConfig extends AbstractJdbcConfiguration {

    @Bean
    public NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }

    @Bean
    public JdbcCustomConversions jdbcCustomConversions() {
        return new JdbcCustomConversions(Arrays.asList(
                new IntegerToBooleanConverter(),
                new BooleanToIntegerConverter())
        );
    }

    @Bean
    public AuditorAware<Long> auditorAware(Context context) {
        return new UserAuditorAware(context);
    }

}