package org.cryptocoinpartners.module;
import org.cryptocoinpartners.schema.BarFactory;
import org.cryptocoinpartners.schema.BookFactory;
import org.cryptocoinpartners.schema.CurrencyFactory;
import org.cryptocoinpartners.schema.FillFactory;
import org.cryptocoinpartners.schema.GeneralOrderFactory;
import org.cryptocoinpartners.schema.MarketFactory;
import org.cryptocoinpartners.schema.OrderUpdateFactory;
import org.cryptocoinpartners.schema.PositionFactory;
import org.cryptocoinpartners.schema.ReplayFactory;
import org.cryptocoinpartners.schema.SpecificOrderFactory;
import org.cryptocoinpartners.schema.TradeFactory;
import org.cryptocoinpartners.schema.TransactionFactory;
import org.cryptocoinpartners.schema.dao.BarDao;
import org.cryptocoinpartners.schema.dao.BarJpaDao;
import org.cryptocoinpartners.schema.dao.BookDao;
import org.cryptocoinpartners.schema.dao.BookJpaDao;
import org.cryptocoinpartners.schema.dao.CurrencyDao;
import org.cryptocoinpartners.schema.dao.CurrencyJpaDao;
import org.cryptocoinpartners.schema.dao.ExchangeDao;
import org.cryptocoinpartners.schema.dao.ExchangeJpaDao;
import org.cryptocoinpartners.schema.dao.FillDao;
import org.cryptocoinpartners.schema.dao.FillJpaDao;
import org.cryptocoinpartners.schema.dao.HoldingDao;
import org.cryptocoinpartners.schema.dao.HoldingJpaDao;
import org.cryptocoinpartners.schema.dao.ListingDao;
import org.cryptocoinpartners.schema.dao.ListingJpaDao;
import org.cryptocoinpartners.schema.dao.MarketDao;
import org.cryptocoinpartners.schema.dao.MarketJpaDao;
import org.cryptocoinpartners.schema.dao.OrderDao;
import org.cryptocoinpartners.schema.dao.OrderJpaDao;
import org.cryptocoinpartners.schema.dao.OrderUpdateDao;
import org.cryptocoinpartners.schema.dao.OrderUpdateJpaDao;
import org.cryptocoinpartners.schema.dao.PortfolioDao;
import org.cryptocoinpartners.schema.dao.PortfolioJpaDao;
import org.cryptocoinpartners.schema.dao.PositionDao;
import org.cryptocoinpartners.schema.dao.PositionJpaDao;
import org.cryptocoinpartners.schema.dao.PromptDao;
import org.cryptocoinpartners.schema.dao.PromptJpaDao;
import org.cryptocoinpartners.schema.dao.ReportDao;
import org.cryptocoinpartners.schema.dao.ReportJpaDao;
import org.cryptocoinpartners.schema.dao.TradeDao;
import org.cryptocoinpartners.schema.dao.TradeJpaDao;
import org.cryptocoinpartners.schema.dao.TransactionDao;
import org.cryptocoinpartners.schema.dao.TransactionJpaDao;
import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;
public class PersistanceModule extends AbstractModule {
//private static final ThreadLocal<EntityManager> ENTITY_MANAGER_CACHE = new ThreadLocal<EntityManager>();
@Override
public void configure() {
// @Override
//public void configure(Binder binder) {
// int retryCount = ConfigUtil.combined().getInt("db.persist.retry");
// Properties properties = new Properties();
// //Map<String, String> properties = new HashMap<String, String>();
//
// retryCount = ConfigUtil.combined().getInt("db.persist.retry");
//
// properties.put("hibernate.hbm2ddl.auto", "update");
// properties.put("hibernate.connection.driver_class", ConfigUtil.combined().getString("db.driver"));
// properties.put("hibernate.dialect", ConfigUtil.combined().getString("db.dialect"));
// properties.put("hibernate.connection.url", ConfigUtil.combined().getString("db.url"));
// properties.put("hibernate.connection.username", ConfigUtil.combined().getString("db.username"));
// properties.put("hibernate.connection.password", ConfigUtil.combined().getString("db.password"));
// properties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
// properties.put("hibernate.connection.autocommit", "true");
// properties.put("hibernate.connection.autocommit", "true");
// properties.put("hibernate.connection.release_mode", "auto");
// properties.put("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
// properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
// properties.put("hibernate.cache.use_second_level_cache", "true");
// properties.put("hibernate.cache.use_query_cache", "true");
// properties.put("hibernate.c3p0.min_size", "10");
// properties.put("hibernate.c3p0.max_size", ConfigUtil.combined().getString("db.pool.size"));
// properties.put("hibernate.c3p0.acquire_increment", ConfigUtil.combined().getString("db.pool.growth"));
// properties.put("show_sql", "true");
// properties.put("format_sql", "true");
// properties.put("use_sql_comments", "true");
// // properties.put("hibernate.c3p0.debugUnreturnedConnectionStackTraces", "true");
// // properties.put("hibernate.c3p0.unreturnedConnectionTimeout", "120");
// // properties.put("hibernate.c3p0.idle_test_period", ConfigUtil.combined().getString("db.idle.test.period"));
// // properties.put("hibernate.c3p0.max_statements", "0");
// // properties.put("hibernate.c3p0.maxIdleTimeExcessConnections", "2");
// // properties.put("hibernate.c3p0.timeout", "300");
// //properties.put("hibernate.c3p0.checkoutTimeout", "500");
// properties.put("hibernate.c3p0.preferredTestQuery", "SELECT 1 from exchange");
// // properties.put("hibernate.c3p0.maxConnectionAge", ConfigUtil.combined().getString("db.max.connection.age"));
// final String testConnection = ConfigUtil.combined().getString("db.test.connection");
// properties.put("hibernate.c3p0.testConnectionOnCheckin", testConnection);
// properties.put("hibernate.c3p0.acquireRetryDelay", "1000");
// properties.put("hibernate.c3p0.acquireRetryAttempts", "0");
// properties.put("hibernate.c3p0.breakAfterAcquireFailure", "false");
// properties.put("hibernate.c3p0.checkoutTimeout", "10000");
// properties.put("hibernate.c3p0.idleConnectionTestPeriod", "100");
//
// properties.put("javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE");
//
// JpaPersistModule jpa = new JpaPersistModule("org.cryptocoinpartners.schema");
// jpa.properties(properties);
// jpa.configure(binder());
/* requestStaticInjection(Market.class);
requestStaticInjection(Exchange.class);
requestStaticInjection(Listing.class);
requestStaticInjection(Prompt.class);
requestStaticInjection(Currency.class);
requestStaticInjection(Portfolio.class);
requestStaticInjection(Transaction.class);
requestStaticInjection(Fill.class);
requestStaticInjection(OrderUpdate.class);
*/
//bind(Dao.class).to(DaoJpa.class);
bind(PortfolioDao.class).to(PortfolioJpaDao.class);
bind(BookDao.class).to(BookJpaDao.class);
bind(BarDao.class).to(BarJpaDao.class);
bind(CurrencyDao.class).to(CurrencyJpaDao.class);
bind(ExchangeDao.class).to(ExchangeJpaDao.class);
bind(FillDao.class).to(FillJpaDao.class);
bind(ListingDao.class).to(ListingJpaDao.class);
bind(MarketDao.class).to(MarketJpaDao.class);
bind(HoldingDao.class).to(HoldingJpaDao.class);
//bind(MarketDataDao.class).to(MarketDataJpaDao.class);
bind(OrderDao.class).to(OrderJpaDao.class);
bind(PositionDao.class).to(PositionJpaDao.class);
bind(PromptDao.class).to(PromptJpaDao.class);
bind(TradeDao.class).to(TradeJpaDao.class);
bind(TransactionDao.class).to(TransactionJpaDao.class);
bind(OrderUpdateDao.class).to(OrderUpdateJpaDao.class);
bind(ReportDao.class).to(ReportJpaDao.class);
// bind(OrderUpdateDao.class).to(OrderUpdateJpaDao.class);
// bind(FillDao.class).to(FillJpaDao.class);
//bind(SpecificOrderFactory.class).to(SpecificOrderFactory.class);
// install(new FactoryModuleBuilder().build(PortfolioFactory.class));
install(new FactoryModuleBuilder().build(CurrencyFactory.class));
install(new FactoryModuleBuilder().build(MarketFactory.class));
install(new FactoryModuleBuilder().build(GeneralOrderFactory.class));
install(new FactoryModuleBuilder().build(SpecificOrderFactory.class));
install(new FactoryModuleBuilder().build(FillFactory.class));
install(new FactoryModuleBuilder().build(PositionFactory.class));
install(new FactoryModuleBuilder().build(OrderUpdateFactory.class));
install(new FactoryModuleBuilder().build(TransactionFactory.class));
install(new FactoryModuleBuilder().build(ReplayFactory.class));
install(new FactoryModuleBuilder().build(BookFactory.class));
install(new FactoryModuleBuilder().build(TradeFactory.class));
install(new FactoryModuleBuilder().build(BarFactory.class));
// .build(SpecificOrderFactory.class));
// install(new FactoryModuleBuilder().implement(Serializable.class, GeneralOrder.class).build(GeneralOrderFactory.class));
}
// @Provides
// @Singleton
// public EntityManagerFactory provideEntityManagerFactory() {
//
// // createMode = "update";
// return Persistence.createEntityManagerFactory("org.cryptocoinpartners.schema", properties);
// }
// @Provides
// public EntityManager provideEntityManager(EntityManagerFactory entityManagerFactory) {
// // EntityManager entityManager = ENTITY_MANAGER_CACHE.get();
// //if (entityManager == null) {
// // ENTITY_MANAGER_CACHE.set(entityManager = entityManagerFactory.createEntityManager());
// // }
// // return entityManager;
// }
}