/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DataLayer;

import FunctionLayer.SimilarityMatrix;
import FunctionLayer.CustomError;
import com.google.common.collect.MapMaker;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author install1
 */
public class DataMapper {

    public static void createTables() throws CustomError {
        Connection l_cCon = null;
        PreparedStatement l_pStatement = null;
        ResultSet l_rsSearch = null;
        try {
            l_cCon = DBCPDataSource.getConnection();
            String l_sSQL = "CREATE TABLE IF NOT EXISTS `ArtificialAutism`.`Sentences` (`Strings` text NOT NULL)";
            l_pStatement = l_cCon.prepareStatement(l_sSQL);
            l_pStatement.execute();
        } catch (SQLException ex) {
            throw new CustomError("failed in DataMapper  " + ex.getMessage());
        } finally {
            CloseConnections(l_pStatement, l_rsSearch, l_cCon);
        }
    }

    public static ConcurrentMap<Integer, String> getAllStrings() throws CustomError {
        ConcurrentMap<Integer, String> allStrings = new MapMaker().concurrencyLevel(2).makeMap();
        Connection l_cCon = null;
        PreparedStatement l_pStatement = null;
        ResultSet l_rsSearch = null;
        try {
            l_cCon = DBCPDataSource.getConnection();
            String l_sSQL = "SELECT * FROM `Sentences`";
            l_pStatement = l_cCon.prepareStatement(l_sSQL);
            l_rsSearch = l_pStatement.executeQuery();
            int ij = 0;
            while (l_rsSearch.next()) {
                allStrings.put(ij, l_rsSearch.getString(1));
                ij++;
            }
        } catch (SQLException ex) {
            throw new CustomError("failed in DataMapper  " + ex.getMessage());
        } finally {
            CloseConnections(l_pStatement, l_rsSearch, l_cCon);
        }
        return allStrings;
    }

    public static void InsertMYSQLStrings(ConcurrentMap<Integer, String> str) throws CustomError {
        Connection l_cCon = null;
        PreparedStatement l_pStatement = null;
        ResultSet l_rsSearch = null;
        String l_sSQL = "INSERT IGNORE `Sentences` (`Strings`) VALUES (?)";
        try {
            l_cCon = DBCPDataSource.getConnection();
            l_pStatement = l_cCon.prepareStatement(l_sSQL);
            for (String str1 : str.values()) {
                //System.out.println("adding str1: " + str1 + "\n");
                l_pStatement.setString(1, str1);
                l_pStatement.addBatch();
            }
            l_pStatement.executeBatch();
        } catch (SQLException ex) {
            throw new CustomError("failed in DataMapper  " + ex.getMessage());
        } finally {
            CloseConnections(l_pStatement, l_rsSearch, l_cCon);
        }
    }


    public static void CloseConnections(PreparedStatement ps, ResultSet rs, Connection con) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
                Logger.getLogger(DataMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DataMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(DataMapper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
