/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.config;


import org.hibernate.SessionFactory;
import org.onap.portalsdk.core.service.DataAccessService;
import org.onap.portalsdk.core.service.DataAccessServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class DataSourceConfig {

    @Bean
    @Autowired
    public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        //I used this class org.openecomp.portalsdk.core.conf.HibernateConfiguration to learn how to config the session factory
        // and use the following url for actual h2 properties
        //https://github.com/levi-putna/Hibernate-H2-Example/blob/master/hibernate-h2-example/src/hibernate.cfg.xml
        Properties properties = getH2Properties();

        properties.put("hibernate.default_schema", "PUBLIC");
        properties.put("connection.pool_size", 10);
        properties.put("cache.provider_class", "org.hibernate.cache.internal.NoCacheProvider");
        properties.put("hibernate.show_sql", false);
        properties.put("hbm2ddl.auto", "create");
        properties.put("hibernate.hbm2ddl.auto", "create");

        sessionFactory.setHibernateProperties(properties);
        sessionFactory.setPackagesToScan("org.onap");
        return sessionFactory;
    }

    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1");
        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    }

    public Properties getH2Properties() {
        Properties properties = new Properties();
        properties.put("dialect", "org.hibernate.dialect.H2Dialect");
        return properties;
    }

    public Properties getSqliteProperties() {
        Properties properties = new Properties();
        properties.put("connection.driver_class", "org.sqlite.JDBC");
        properties.put("connection.url", "jdbc:sqlite:memory:myDb");
        properties.put("connection.username", "sa");
        properties.put("connection.password", "sa");
        properties.put("dialect", "com.enigmabridge.hibernate.dialect.SQLiteDialect");
        return properties;
    }

    @Bean
    public DataAccessService dataAccessService() {
        return new DataAccessServiceImpl();
    }

    @Bean
    @Autowired
    public PlatformTransactionManager transactionManager(SessionFactory sessionFactory) {
        return new HibernateTransactionManager(sessionFactory);
    }
}
