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

import com.orientechnologies.orient.core.db.document.ODatabaseDocumentPool;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.exception.OSecurityAccessException;
import com.orientechnologies.orient.core.exception.OStorageException;
import com.orientechnologies.orient.core.metadata.security.OSecurity;
import com.orientechnologies.orient.core.metadata.security.OUser;


@SuppressWarnings("deprecation")
public class CDatabaseConnector 
{
	private String m_user;
	private String m_password;
	private String m_path;
	private ODatabaseDocumentTx db;
	private List<ODatabaseDocumentTx> acquired_db;
	
	CDatabaseConnector(String user, String password, String path)
	{
		m_user = user;
		m_password = password;
		m_path = path;
		acquired_db= new ArrayList<ODatabaseDocumentTx>();
	}
	
	public boolean connect()
	{	
		boolean state = false;
		
		try
		{
			db = new ODatabaseDocumentTx ("plocal:"+m_path);
			db.open(m_user,m_password);
					
			state = true;
		}
		catch(OStorageException|OSecurityAccessException e)
		{
			if(e instanceof OStorageException) 
			{
				db = new ODatabaseDocumentTx ("plocal:"+m_path);
				db.create();
				
				OSecurity sm = db.getMetadata().getSecurity();
				sm.dropUser("admin");
				
				OUser user = sm.createUser(m_user,m_password, new String[] { "admin" } );
				db.setUser(user);
				
				state = true;
			}
			else if(e instanceof OSecurityAccessException)
			{
				System.out.println("Wrong user/password combination");
				System.err.println(e.getMessage());
				state = false;
			}
		}
	
		return state;
	}
	
	public ODatabaseDocumentTx acquirePoolConnection()
	{	
		try
		{
			acquired_db.add(ODatabaseDocumentPool.global().acquire("plocal:"+m_path, m_user, m_password));
			System.out.println("Successfully acquired pool connection.");
			return acquired_db.get(acquired_db.size()-1);
		}
		catch(Exception e)
		{
			System.err.println("Some error occured aquiring a connection from the pool.");
			System.err.println(e.getMessage());
			
			return acquired_db.get(acquired_db.size()-1);
		}
	}
	
	public boolean releasePoolConnection()
	{
		try
		{
			acquired_db.get(acquired_db.size()-1).close();
			System.out.println("Acquired instance released.");
			return true;
		}
		catch(Exception e)
		{
			System.err.println("Some error occured releasing the database instance.");
			System.err.println(e.getMessage());
			
			return false;
		}
	}
	
	
	public boolean disconnect()
	{
		try
		{	  
			db.activateOnCurrentThread();	
		    db.close();
			System.out.println("Databasesession closed.");

			return true;
		}
		catch(Exception e)
		{
			System.err.println("Some error occured disconnecting from database.");
			System.err.println(e.getMessage());
			
			return false;
		}
	}
}
