package eu.dnetlib.usagestats.repos;

import eu.dnetlib.usagestats.domain.UsageStats;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by eri_k on 3/28/2016.
 */
public class BaseRepository {
    @Autowired
    DataSource dataSource;

    private Connection connection;
    private Logger log = Logger.getLogger(this.getClass());


    protected List<UsageStats> executeQuery(String query) {
        List<UsageStats> statsList = new ArrayList<UsageStats>();

        try {
            Connection connection = dataSource.getConnection();
            Statement st = connection.createStatement();
            st.execute(query);
            ResultSet rs = st.getResultSet();

            while (rs.next()) {
                UsageStats stats = new UsageStats();
                stats.setId(rs.getString(1));
                stats.setName(rs.getString(2));
                stats.setValue(rs.getInt(3));
                statsList.add(stats);
            }

            rs.close();
            st.close();
            connection.close();
        } catch (
                Exception e
                )

        {
            log.error("Cannot execute query : " + e);
        }

        return statsList;
    }


    protected List<UsageStats> executePreparedQuery(String query, List<String> values) {
        List<UsageStats> statsList = new ArrayList<UsageStats>();

        try {
            Connection connection = dataSource.getConnection();
            PreparedStatement st = connection.prepareStatement(query);
            int i = 1;

            for (String s : values) {
                st.setString(i, s);
                i++;
            }


            ResultSet rs = st.executeQuery();

            while (rs.next()) {
                UsageStats stats = new UsageStats();
                stats.setId(rs.getString(1));
                stats.setName(rs.getString(2));
                stats.setValue(rs.getInt(3));
                statsList.add(stats);
            }

            rs.close();
            st.close();
            connection.close();
        } catch (
                Exception e
                )

        {
            log.error("Cannot execute query : " + e);
        }

        return statsList;
    }
}
