package voi.db;

import java.sql.*;
import java.lang.*;
import java.util.*;
import voi.routines.*;


/**
This class accepts as assembles the query results 
IT uses a method which accepts as parameters 
1) ResultSet object
2) Flags
*/
public class AssembleQueryResults 
{
	private ResultSet results;
	private boolean[] queryFlags = null;
	private String [] columnNames = new String[0];
	private Vector dataRows;
	private int columns;
	
	private final int ABS_MAG = 9;
	
	public AssembleQueryResults (ResultSet results)
	{
		this.results = results;
	}
	
	public AssembleQueryResults (ResultSet results, boolean[] queryFlags)
	{
		this.results = results;
		this.queryFlags = queryFlags;
	}
	
	public String [] getColumnNames ()
	{
		try
		{
			// get the metadata for the result
			ResultSetMetaData metadata = results.getMetaData ();
			
			// obtain how many columns are required for Table display
			columns = metadata.getColumnCount ();
			columnNames = new String [columns + getDerivedColumns ()];
			
			// get the column names
			int i;
			for (i = 0; i < metadata.getColumnCount (); i++)
				columnNames [i] = metadata.getColumnLabel(i+1);
		
			if (queryFlags != null)
			{
			/** add absolute magnitude if it is selected by the user **/		
				if (queryFlags[ABS_MAG]) columnNames [i] = "Absolute Magnitude";
			}
		}
		catch (SQLException e)
		{
			System.out.println (" A SQL Exception has occured while setting column names ");
		}
		return columnNames;
	}
	 
	
	public Vector getDataRows ()
	{
		dataRows = new Vector();
		String[] rowData;			// local variable to get the rowdata
		try
		{ 				
			while (results.next ())
			{
				int i; // loop variable
				rowData = new String [columns + getDerivedColumns ()];
				for (i = 0; i < columns; i++)
					rowData [i] = results.getString (i+1);
				
				if (queryFlags != null)
				{
					if (queryFlags[ABS_MAG])			
					{
						int bjIndex = getIndex ("bj", columns);
						int z1Index = getIndex ("z1", columns);
	
						double bj = Double.parseDouble (rowData [bjIndex]);
						double z1 = Double.parseDouble (rowData [z1Index]);
						double absMag = 0.00;
						if (z1 != 0)
						{	
							absMag = getAbsoluteMagnitude (bj, z1);
						}
						rowData [i] = Double.toString (absMag);
					}
				}
				dataRows.addElement (rowData);
			}    // end while
		}
		catch (SQLException e)
		{
			System.out.println (" A SQL exception has occured during adding data to vector class ");
		}
		return dataRows;
	}
	

	public String[] getRowData (ResultSet rs)
	{
		String[] rowData;			// local variable to get the rowdata
		rowData = new String [columns + getDerivedColumns ()];
		try
		{ 				
			int i; // loop variable
			
			for (i = 0; i < columns; i++)
				rowData [i] = rs.getString (i+1);
			
			if (queryFlags != null)
			{
				if (queryFlags[ABS_MAG])				
				{
					int bjIndex = getIndex ("bj", columns);
					int z1Index = getIndex ("z1", columns);
					double bj = Double.parseDouble (rowData [bjIndex]);
					double z1 = Double.parseDouble (rowData [z1Index]);
					double absMag = 0.00;
					if (z1 != 0)
					{	
						absMag = getAbsoluteMagnitude (bj, z1);
					}
					rowData [i] = Double.toString (absMag);
				}
			}
		}
		catch (SQLException e)
		{
			System.out.println (" A SQL exception has occured during adding data to vector class ");
		} 
		return rowData;
	}	
	
	public int getIndex (String name, int columns)
	{
		for (int i = 0; i < columns; i++)
			if (columnNames[i].equals (name)) 
				return i;
		return 0;
	}
	
	public int getDerivedColumns ()
	{
		if (queryFlags == null) return 0;
		int returnValue = 0;
		if (queryFlags [ABS_MAG]) returnValue =  1;
		return returnValue;
		
	}
	
	public double getAbsoluteMagnitude (double bj, double z1)
	{
		double absMag;
	//	Magnitude.setParameters (100.0,0.5,0.5); // set the parameters for the Magnitude class
		double temp1 = Magnitude.getAbsoluteMagnitude (bj, z1); // obtain absolute magnitude
		int temp2 = (int) (temp1 * 100);
		absMag = (double) temp2 / 100;
		return absMag;
	}
	
	public int getTotalColumns ()
	{
		return columns + getDerivedColumns ();
	}
}

