/*********************************************************************
 * Author: B. Alex Bridges                                           *
 * File: Database.java                                               *
 * Class: CPSC-101 Lab Section 3                                     *
 * Project: Lab 8 - Database Reporter                                *
 * Purpose: This program prepares reports for a small faculty/student*
 *          database.                                                *
 *********************************************************************/

/* IMPORTS */
import java.awt.*;
import java.io.*;
import java.util.StringTokenizer;


class Database
{
	/* MAGIC NUMBERS */
	final static int mn_Temp = 100;

	/*********************************************************************
	 * MAIN METHOD                                                       *
	 *********************************************************************/
	/*************************************************************************
	 * Purpose: Prepares reports for a small faculty/student database.       *
	 * Input: --STANDARD--                                                   *
	 *        A database of records for 2 kinds of people:                   *
	 *        => FACULTY = f 'NAME' 'SSN' 'DEPT' 'TITLE' 'SALARY'            *
	 *        => STUDENT = s 'NAME' 'SN' 'MAJOR' 'WAG' 'GRAD'                *
	 * Output: --STANDARD--                                                  *
	 *         => Identification information                                 *
	 *         => Echo of the input, labeled                                 *
	 *         => The entire database, sorted by name, labeled               *
	 *         => The faculty, sorted by department, then by name, labeled   *
	 *         => The students, sorted by WAG, labeled                       *
	 *         --RETURN VALUES--                                             *
	 *         => COMPLETED SUCCESSFULLY = 0                                 *
	 *         => ERROR = -1                                                 *
	 * Called Routines: N/A                                                  *
	 * Assumptions: The input is correct.                                    *
	 *************************************************************************/
	public static void main (String[] args) throws IOException
	{
		/* LOCAL VARIABLES */
		StringTokenizer strT_Parser;				// STRING TOKENIZER
		String strA_Type[] = new String[101];		// TYPE OF PERSON
		String strA_Name[] = new String[101];		// NAME OF PERSON
		String strA_SSN_SN[] = new String[101];		// SSN or SN OF PERSON
		String strA_Dept_Mjr[] = new String[101];	// DEPT. or MAJOR OF PERSON
		String strA_Title_WAG[] = new String[101];	// TITLE or WAG OF PERSON
		String strA_Sal_Grad[] = new String[101];	// SALARY or GRAD. DATE OF PERSON
		int int_i = 0;								// ARRAY INDEX
		int int_j = 0;								// ARRAY INDEX
		int int_NumPeople = 0;						// NUMBER OF PEOPLE

		/* STANDARD TEXT INPUT STREAM SETUP */
		BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in) );

		/* HEADER */
		System.out.println("B. Alex Bridges\n"+
		                   "CPSC-101, Winter 1998\n"+
		                   "The Database Reporter Program\n");

		/* READ & STORE INPUT */
		while( ( stdin.ready() ) && ( int_i != 100 ) )
		{
			// LINE OF INPUT => TOKENS
			strT_Parser = new StringTokenizer( stdin.readLine(), "\t\n\r", false );

			// TOKENS => INFO.
			// = FACULTY or STUDENT
			strA_Type[int_i] = strT_Parser.nextToken();
			// = NAME
			strA_Name[int_i] = strT_Parser.nextToken();
			// = SSN or SN
			strA_SSN_SN[int_i] = strT_Parser.nextToken();
			// = DEPT. or MAJOR
			strA_Dept_Mjr[int_i] = strT_Parser.nextToken();
			// = TITLE or WAG
			strA_Title_WAG[int_i] = strT_Parser.nextToken();
			// = SALARY or GRAD. DATE
			strA_Sal_Grad[int_i] = strT_Parser.nextToken();

			int_i++;
		} // while

		/* NUMBER OF PEOPLE */
		int_NumPeople = int_i;

		/* ECHO INPUT */
		System.out.println("--ENTIRE DATABASE AS ENTERED--");
		for( int_i = 0; int_i < int_NumPeople; int_i++ )
		{
			System.out.println("Entry #"+int_i);
			System.out.println(" => Name = '"+strA_Name[int_i]+"'");
			if( strA_Type[int_i].equals("f") )
			{
				System.out.println(" => Social Security Number = '"+strA_SSN_SN[int_i]+"'");
				System.out.println(" => Department = '"+strA_Dept_Mjr[int_i]+"'");
				System.out.println(" => Title = '"+strA_Title_WAG[int_i]+"'");
				System.out.println(" => Salary = '"+strA_Sal_Grad[int_i]+"'");
			} // if
			else if( strA_Type[int_i].equals("s") )
			{
				System.out.println(" => Student Number = '"+strA_SSN_SN[int_i]+"'");
				System.out.println(" => Major = '"+strA_Dept_Mjr[int_i]+"'");
				System.out.println(" => WAG = '"+strA_Title_WAG[int_i]+"'");
				System.out.println(" => Graduation Date = '"+strA_Sal_Grad[int_i]+"'");
			} // if
			System.out.println(); // BLANK LINE
		} // for

	/*  ENTIRE DATABASE SORTED BY NAME */
	// SORTING
	for(int_i = 0; int_i < int_NumPeople; int_i++)
	{
		for(int_j = int_i + 1; int_j < int_NumPeople; int_j++)
		{
			if( strA_Name[int_i].compareTo(strA_Name[int_j]) > 0 )
			{
				// i GOES TO mn_Temp
				strA_Type[mn_Temp] = strA_Type[int_i];
				strA_Name[mn_Temp] = strA_Name[int_i];
				strA_SSN_SN[mn_Temp] = strA_SSN_SN[int_i];
				strA_Dept_Mjr[mn_Temp] = strA_Dept_Mjr[int_i];
				strA_Title_WAG[mn_Temp] = strA_Title_WAG[int_i];
				strA_Sal_Grad[mn_Temp] = strA_Sal_Grad[int_i];

				// j GOES TO i
				strA_Type[int_i] = strA_Type[int_j];
				strA_Name[int_i] = strA_Name[int_j];
				strA_SSN_SN[int_i] = strA_SSN_SN[int_j];
				strA_Dept_Mjr[int_i] = strA_Dept_Mjr[int_j];
				strA_Title_WAG[int_i] = strA_Title_WAG[int_j];
				strA_Sal_Grad[int_i] = strA_Sal_Grad[int_j];

				// mn_Temp GOES TO j
				strA_Type[int_j] = strA_Type[mn_Temp];
				strA_Name[int_j] = strA_Name[mn_Temp];
				strA_SSN_SN[int_j] = strA_SSN_SN[mn_Temp];
				strA_Dept_Mjr[int_j] = strA_Dept_Mjr[mn_Temp];
				strA_Title_WAG[int_j] = strA_Title_WAG[mn_Temp];
				strA_Sal_Grad[int_j] = strA_Sal_Grad[mn_Temp];
			} // if
		} // for
	} // for

	// OUTPUT
	System.out.println("--ENTIRE DATABASE SORTED BY NAME--");
	for( int_i = 0; int_i < int_NumPeople; int_i++ )
	{
		System.out.println("Entry #"+int_i);
		System.out.println(" => Name = '"+strA_Name[int_i]+"'");
		if( strA_Type[int_i].equals("f") )
		{
			System.out.println(" => Social Security Number = '"+strA_SSN_SN[int_i]+"'");
			System.out.println(" => Department = '"+strA_Dept_Mjr[int_i]+"'");
			System.out.println(" => Title = '"+strA_Title_WAG[int_i]+"'");
			System.out.println(" => Salary = '"+strA_Sal_Grad[int_i]+"'");
		} // if
		else if( strA_Type[int_i].equals("s") )
		{
			System.out.println(" => Student Number = '"+strA_SSN_SN[int_i]+"'");
			System.out.println(" => Major = '"+strA_Dept_Mjr[int_i]+"'");
			System.out.println(" => WAG = '"+strA_Title_WAG[int_i]+"'");
			System.out.println(" => Graduation Date = '"+strA_Sal_Grad[int_i]+"'");
		} // if
		System.out.println(); // BLANK LINE
	} // for

	/*  FACULTY SORTED BY DEPARTMENT, THEN NAME */
	// SORTING
	for(int_i = 0; int_i < int_NumPeople; int_i++)
	{
		for(int_j = int_i + 1; int_j < int_NumPeople; int_j++)
		{
			if( strA_Dept_Mjr[int_i].compareTo(strA_Dept_Mjr[int_j]) > 0 )
			{
				// i GOES TO mn_Temp
				strA_Type[mn_Temp] = strA_Type[int_i];
				strA_Name[mn_Temp] = strA_Name[int_i];
				strA_SSN_SN[mn_Temp] = strA_SSN_SN[int_i];
				strA_Dept_Mjr[mn_Temp] = strA_Dept_Mjr[int_i];
				strA_Title_WAG[mn_Temp] = strA_Title_WAG[int_i];
				strA_Sal_Grad[mn_Temp] = strA_Sal_Grad[int_i];

				// j GOES TO i
				strA_Type[int_i] = strA_Type[int_j];
				strA_Name[int_i] = strA_Name[int_j];
				strA_SSN_SN[int_i] = strA_SSN_SN[int_j];
				strA_Dept_Mjr[int_i] = strA_Dept_Mjr[int_j];
				strA_Title_WAG[int_i] = strA_Title_WAG[int_j];
				strA_Sal_Grad[int_i] = strA_Sal_Grad[int_j];

				// mn_Temp GOES TO j
				strA_Type[int_j] = strA_Type[mn_Temp];
				strA_Name[int_j] = strA_Name[mn_Temp];
				strA_SSN_SN[int_j] = strA_SSN_SN[mn_Temp];
				strA_Dept_Mjr[int_j] = strA_Dept_Mjr[mn_Temp];
				strA_Title_WAG[int_j] = strA_Title_WAG[mn_Temp];
				strA_Sal_Grad[int_j] = strA_Sal_Grad[mn_Temp];
			} // if
			else if( strA_Dept_Mjr[int_i].compareTo(strA_Dept_Mjr[int_j]) == 0 )
			{
				if( strA_Name[int_i].compareTo(strA_Name[int_j]) > 0 )
				{
					// i GOES TO mn_Temp
					strA_Type[mn_Temp] = strA_Type[int_i];
					strA_Name[mn_Temp] = strA_Name[int_i];
					strA_SSN_SN[mn_Temp] = strA_SSN_SN[int_i];
					strA_Dept_Mjr[mn_Temp] = strA_Dept_Mjr[int_i];
					strA_Title_WAG[mn_Temp] = strA_Title_WAG[int_i];
					strA_Sal_Grad[mn_Temp] = strA_Sal_Grad[int_i];

					// j GOES TO i
					strA_Type[int_i] = strA_Type[int_j];
					strA_Name[int_i] = strA_Name[int_j];
					strA_SSN_SN[int_i] = strA_SSN_SN[int_j];
					strA_Dept_Mjr[int_i] = strA_Dept_Mjr[int_j];
					strA_Title_WAG[int_i] = strA_Title_WAG[int_j];
					strA_Sal_Grad[int_i] = strA_Sal_Grad[int_j];

					// mn_Temp GOES TO j
					strA_Type[int_j] = strA_Type[mn_Temp];
					strA_Name[int_j] = strA_Name[mn_Temp];
					strA_SSN_SN[int_j] = strA_SSN_SN[mn_Temp];
					strA_Dept_Mjr[int_j] = strA_Dept_Mjr[mn_Temp];
					strA_Title_WAG[int_j] = strA_Title_WAG[mn_Temp];
					strA_Sal_Grad[int_j] = strA_Sal_Grad[mn_Temp];
				} // if
			} //if
		} // for
	} // for

	// OUTPUT
	System.out.println("--FACULTY SORTED BY DEPARTMENT, THEN NAME--");
	for( int_i = 0; int_i < int_NumPeople; int_i++ )
	{
		if( strA_Type[int_i].equals("f") )
		{
			System.out.println("Entry #"+int_i);
			System.out.println(" => Department = '"+strA_Dept_Mjr[int_i]+"'");
			System.out.println(" => Name = '"+strA_Name[int_i]+"'");
			System.out.println(" => Social Security Number = '"+strA_SSN_SN[int_i]+"'");
			System.out.println(" => Title = '"+strA_Title_WAG[int_i]+"'");
			System.out.println(" => Salary = '"+strA_Sal_Grad[int_i]+"'");
			System.out.println(); // BLANK LINE
		} // if
	} // for

	/*  STUDENTS SORTED BY WAG */
	// SORTING
	for(int_i = 0; int_i < int_NumPeople; int_i++)
	{
		for(int_j = int_i + 1; int_j < int_NumPeople; int_j++)
		{
			if( strA_Title_WAG[int_i].compareTo(strA_Title_WAG[int_j]) > 0 )
			{
				// i GOES TO mn_Temp
				strA_Type[mn_Temp] = strA_Type[int_i];
				strA_Name[mn_Temp] = strA_Name[int_i];
				strA_SSN_SN[mn_Temp] = strA_SSN_SN[int_i];
				strA_Dept_Mjr[mn_Temp] = strA_Dept_Mjr[int_i];
				strA_Title_WAG[mn_Temp] = strA_Title_WAG[int_i];
				strA_Sal_Grad[mn_Temp] = strA_Sal_Grad[int_i];

				// j GOES TO i
				strA_Type[int_i] = strA_Type[int_j];
				strA_Name[int_i] = strA_Name[int_j];
				strA_SSN_SN[int_i] = strA_SSN_SN[int_j];
				strA_Dept_Mjr[int_i] = strA_Dept_Mjr[int_j];
				strA_Title_WAG[int_i] = strA_Title_WAG[int_j];
				strA_Sal_Grad[int_i] = strA_Sal_Grad[int_j];

				// mn_Temp GOES TO j
				strA_Type[int_j] = strA_Type[mn_Temp];
				strA_Name[int_j] = strA_Name[mn_Temp];
				strA_SSN_SN[int_j] = strA_SSN_SN[mn_Temp];
				strA_Dept_Mjr[int_j] = strA_Dept_Mjr[mn_Temp];
				strA_Title_WAG[int_j] = strA_Title_WAG[mn_Temp];
				strA_Sal_Grad[int_j] = strA_Sal_Grad[mn_Temp];
			} // if
		} // for
	} // for

	// OUTPUT
	System.out.println("--STUDENTS SORTED BY WAG--");
	for( int_i = 0; int_i < int_NumPeople; int_i++ )
	{
		if( strA_Type[int_i].equals("s") )
		{
			System.out.println("Entry #"+int_i);
			System.out.println(" => WAG = '"+strA_Title_WAG[int_i]+"'");
			System.out.println(" => Name = '"+strA_Name[int_i]+"'");
			System.out.println(" => Student Number = '"+strA_SSN_SN[int_i]+"'");
			System.out.println(" => Major = '"+strA_Dept_Mjr[int_i]+"'");
			System.out.println(" => Graduation Date = '"+strA_Sal_Grad[int_i]+"'");
			System.out.println(); // BLANK LINE
		} // if
	} // for

	} // method main
} // class Database

