package com.kubrynski.data.config;

import com.kubrynski.data.repository.generic.GenericRepositoryFactoryBean;
import org.hibernate.ejb.HibernatePersistence;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

/**
 * @author [email protected]
 * @since 2013-03-30
 */
@Configuration
@EnableJpaRepositories(basePackages = "com.kubrynski.data.repository",
    repositoryFactoryBeanClass = GenericRepositoryFactoryBean.class)
@EnableTransactionManagement
public class DataConfig {

  @Bean
  public DataSource dataSource() {
    EmbeddedDatabaseFactoryBean databaseFactoryBean = new EmbeddedDatabaseFactoryBean();
    databaseFactoryBean.setDatabaseType(EmbeddedDatabaseType.H2);
    databaseFactoryBean.afterPropertiesSet();
    return databaseFactoryBean.getObject();
  }

  @Bean
  public AbstractEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactory.setDataSource(dataSource());
    entityManagerFactory.setPackagesToScan("com.kubrynski.data.model");
    entityManagerFactory.setPersistenceProvider(new HibernatePersistence());
    entityManagerFactory.getJpaPropertyMap().put("hibernate.hbm2ddl.auto", "create-drop");
    entityManagerFactory.getJpaPropertyMap().put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
    entityManagerFactory.getJpaPropertyMap().put("hibernate.show_sql", "true");
    entityManagerFactory.afterPropertiesSet();

    return entityManagerFactory;
  }

  @Bean
  public PlatformTransactionManager transactionManager() {
    return new JpaTransactionManager(entityManagerFactory().getObject());
  }

}