using System;
using System.Text;
using System.Data;
using System.Configuration;
using java.sql;
using chemaxon.util;
using chemaxon.struc;
using chemaxon.jchem.db;
using chemaxon.sss.search;

namespace JChemBaseSearch
{

    /// 
    /// DataAccess class using JDBC driver 
    /// 
    public static class DataAccess
    {
        private static DataTable GetStructures(int[] ids)
        {
            string structureTableName = ConfigurationManager.AppSettings["username"] + "." + ConfigurationManager.AppSettings["tablename"]; //read configuration settings from app.config
            String sql = "SELECT * " + "FROM " + structureTableName;
            if (ids.Length > 0)
            {
                sql += " WHERE cd_id in (";

                for (int i = 0; i < Math.Min(ids.Length, 10); i++)
                {
                    sql += ids[i] + ",";
                }

                sql = sql.Remove(sql.Length - 1);
                sql += ")";
            }

            Connection con = getConnectionHandler().getConnection();
            PreparedStatement preparedStatement = con.prepareStatement(sql, ResultSet.__Fields.TYPE_SCROLL_INSENSITIVE, ResultSet.__Fields.CONCUR_READ_ONLY);
            //preparedStatement.setInt(1, 1);
            ResultSet results = preparedStatement.executeQuery();

            DataTable dt = new DataTable();
            dt.Columns.Add("cd_id");
            dt.Columns.Add("cd_structure");
            bool a = results.first();

            while (results.next())
            {
                Blob blobStructure = results.getBlob("cd_structure");
                byte[] barr = new byte[blobStructure.length()];
                blobStructure.getBinaryStream().read(barr);
                string molFile = Encoding.ASCII.GetString(barr);
                string cdId = results.getString("cd_id");
                dt.Rows.Add(cdId, molFile);
            }

            return dt;
        }

        private static ConnectionHandler getConnectionHandler()
        {
            string url = ConfigurationManager.AppSettings["url"]; //read configuration settings from App.config
            string username = ConfigurationManager.AppSettings["username"];
            string password = ConfigurationManager.AppSettings["password"];

            try
            {
                DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
                Connection conn = DriverManager.getConnection(url, username, password);

                ConnectionHandler ch = new ConnectionHandler();
                ch.setConnection(conn);

                return ch;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static DataTable SearchStructure(object molecule, JChemSearchOptions searchOptions)
        {
            JChemSearch searcher = new JChemSearch();

            string molStr = molecule as string;
            if (molStr == null)
            {
                Molecule mol = molecule as Molecule;
                searcher.setQueryStructure(mol);
            }
            else
            {
                searcher.setQueryStructure(molStr);
            }

            searcher.setConnectionHandler(getConnectionHandler());
            searcher.setStructureTable(ConfigurationManager.AppSettings["tablename"]);

            searcher.setSearchOptions(searchOptions);
            searcher.setRunMode(JChemSearch.RUN_MODE_SYNCH_COMPLETE);
            searcher.run();

            int[] resultedIds = searcher.getResults();
            return GetStructures(resultedIds);
        }
    }

}