package tableDefinition;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class DatabaseLogin 
//  This version is specific to the version that uses a configuration file rather than the data quality database.
{
	private Connection connection;
	private boolean stateConnected = false;
	private String databaseDriver;
	private String connectionString;
	private String user;
	private String password;
	
	public DatabaseLogin(Configuration configuration, LogFile logFile) 
	{
		StringBuffer microsoft;
        databaseDriver = new String(configuration.getJdbcDriver());

        // Every other database can follow the standard, but not f*****g Microsoft
        if (databaseDriver.contains("microsoft.sqlserver"))
        {
        	microsoft = new StringBuffer(configuration.getConnectionString());
        	microsoft.append(configuration.getHost());        	
        	if (!configuration.getPort().isEmpty())
        		microsoft.append(":" + configuration.getPort());        	
        	if (!configuration.getDatabase().isEmpty())
        		microsoft.append(";databaseName=" + configuration.getDatabase());     
        	microsoft.append(";");
        	connectionString = new String(microsoft.toString());
        }
        else
        {
	        connectionString = new String
	    	(
	    		configuration.getConnectionString() + 
	    		configuration.getHost() + ":" +
	    		configuration.getPort() + "/" +
	    		configuration.getDatabase()
	    	);
        }
        System.out.println("connection string:    " + connectionString);
        user  = new String(configuration.getRealUser());
        password = new String(configuration.getRealPassword());
		
		try
		{
			logFile.logMessage("Trying to connect with driver class: " + databaseDriver);			
			Class.forName (databaseDriver); 
		}
		catch (ClassNotFoundException cnfe)
		{
			logFile.logMessage
			(
				"Failed to load driver " + 
				databaseDriver +
				".  " + 
				cnfe.toString()
			);
		}

		
//		try 
//		{
//			connection = DriverManager.getConnection(connectionString);
//		} 
//		catch (SQLException e) 
//		{
//			System.out.println("Connection assuming user and password in the connection string (or not required) failed.  Trying with separate user and password."); 
//			System.out.println(e.toString());
//			try 
//			{
//				connection = DriverManager.getConnection
//				(
//					connectionString,
//					userName,
//					password
//				);
//			} 
//			catch (SQLException e1) 
//			{
//				logFile.logMessage("Connection separate user and password failed."); 
//				logFile.logMessage(e1.toString());
//			}
//		}	
		
		try	
		{
			if (databaseDriver.contains("microsoft.sqlserver"))
			{
				logFile.logMessage("Microsoft SQL Server connection");
				connection = DriverManager.getConnection
				(
					connectionString
				);
			}
			else
			{
				logFile.logMessage("Connection to a database other than Microsoft SQL Server");
				connection = DriverManager.getConnection
				(
					connectionString,
					user,
					password
				);
			}
		}
		catch (SQLException sqle)
		{
			sqle.printStackTrace();
		}
		
		stateConnected = true;
	}
	
	public Connection getConnection()
	{
		return connection;
	}

	public boolean getStateConnected()
	{
		return stateConnected;
	}
	
	public void disconnect()
	{
		try 
		{
			connection.close();
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}
}
