package com.issue;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.sql.DataSource;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import jakarta.annotation.Resource;
import jakarta.transaction.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@EnableJpaRepositories(basePackages = {"com.issue"})
@EnableTransactionManagement
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class SpringJPAIssueTest {

    @Resource
    IssueRepository issueRepository;

    @TestConfiguration
    static public class H2JpaTestConfig {

        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("org.h2.Driver");
            dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
            dataSource.setUsername("sa");
            dataSource.setPassword("sa");
            return dataSource;
        }

        @Bean
        public PlatformTransactionManager transactionManager(
                LocalContainerEntityManagerFactoryBean entityManagerFactory) {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory.getObject());

            return transactionManager;
        }

        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource datasource) {

            LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setPersistenceUnitName("cfa-library");
            em.setPersistenceProviderClass(org.eclipse.persistence.jpa.PersistenceProvider.class);
            em.setJtaDataSource(datasource);
            em.setPackagesToScan(new String[] { "com.issue" });

            EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();
            vendorAdapter.setGenerateDdl(true);
            vendorAdapter.setShowSql(false);

            em.setJpaVendorAdapter(vendorAdapter);
            em.setJpaProperties(additionalProperties());

            return em;
        }

        Properties additionalProperties() {
            Properties properties = new Properties();
            properties.setProperty("eclipselink.weaving", "false");
            properties.setProperty("eclipselink.ddl-generation", "create-tables");
            properties.setProperty("eclipselink.query-results-cache", "false");

            return properties;
        }

    }

    @Before
    public void setUp() throws Exception {
        issueRepository.save(new IssueTable("1", "Test1"));
        issueRepository.save(new IssueTable("2", "Test2"));
        issueRepository.save(new IssueTable("3", "Test3"));
    }

    @After
    public void deleteAll() {
        issueRepository.deleteAll();
    }

    @Test
    public void testDeleteAllInBatch() {
        List<IssueTable> issue = issueRepository.findAll();
        issueRepository.deleteAllInBatch(issue);
    }

    @Test
    public void testDeleteAllByIdInBatch() {
        List<String> issue = new ArrayList<String>();
        issue.add("1");
        issue.add("2");
        issue.add("3");
        issueRepository.deleteAllByIdInBatch(issue);
    }
}