import java.io.*;
import java.util.Scanner;

/**
 * A command-line application that can be used to calculate sales taxes
 * on different kinds of items.
 *
 * This application accepts one command-line argument, containing the
 * name of the output file.  If the command-line argument is omitted,
 * this application will send all output to the console 
 * (i.e., standard output).
 *
 *
 * This work complies with the JMU Honor Code.
 *
 * @author  Erik Fleming
 * @version 1.0 September 14, 2008
 */
public class TaxOnomy
{
    private static PrintStream    tape;
    private static Scanner        keyboard = new Scanner(System.in);

    /**
     * The entry point of the application
     *
     * @param args   The command-line arguments
     */
    public static void main(String[] args)
    {
       File           tapeFile;       
		 int				 numberOfItems, category[];
		 double			 price[], tax;
		 
       System.out.printf("Enter the number of items: ");
		 numberOfItems = keyboard.nextInt();
		 
		 System.out.printf("You entered: %d\n" ,numberOfItems); //echo

       // Code that handles the command-line arguments
       tape = null;

       // If there is a command-line argument, use it as the
       // file name (if possible)
       
		 if ((args != null) && (args.length > 0))
       {
          tapeFile = new File(args[0]);
          try
          {
             tape  = new PrintStream(tapeFile);
          }// end try
          catch (IOException ioe)
          {
             tape  = System.out;
				 tape.printf("Unable to Write to file");          
          }// end catch
       } // end if
      
       // Otherwise, use System.out
       else
       {
          tape = System.out;          
       }// end else
       // The application logic

		 price = new double[numberOfItems];
		 category = new int[numberOfItems];
		 
		 for(int i = 0; i < numberOfItems; i++)
		 {
			category[i] = requestCategory();
			tape.printf("You entered: %d\n", category[i]); // echo
			
			price[i] = requestDouble("Enter the price: ");
			tape.printf("You entered: %f\n", price[i]); // echo
	 	 }// end for
      

       // Generate the required output

		 tape.printf("%10s", "Summary\n");
		 tape.flush();
		 
		 tax = TaxCalculator.foodTax(price, category);
		 tape.printf("%10s %8.4f\n", "Food: " , tax);
		 tape.flush();
		
		 tax = TaxCalculator.preparedfoodTax(price, category); 
		 tape.printf("%10s %8.4f\n", "Prepared: " , tax);
		 tape.flush();
		 
		 tax = TaxCalculator.nonfoodTax(price, category);
		 tape.printf("%10s %8.4f\n", "Other: " , tax);
		 tape.flush();

    }// end main

    /**
     * Prompt the user to enter a category and then
     * read it in (using the Scanner named keyboard).
     *
     * This method will/must continue to prompt the user
     * until she/he enters a valid category
     *
     * @return         The value 
     */
    private static int requestCategory()
    {
       int        category;
       
		 do
		 {
       		category = 
				requestInt("Enter 0 for non-food, 1 for food, or 2 for prepared: ");
				
				if (category >2 || category < 0)
					System.out.printf("Error, number not between 0 and 3.  ");
				
       }// end do
		 	while (category < 0 || category > 2);

       return category;
    } // end requestCategory

    /**
     * Prompt the user to enter a double and then
     * read it in (using the Scanner named keyboard)
     *
     * @param prompt   The custom portion of the prompt
     * @return         The value 
     */
    private static double requestDouble(String prompt)
    {
       double       value;
       
		 System.out.printf(prompt);
       value = keyboard.nextDouble();
	
       return value;
    }// end request double

    /**
     * Prompt the user to enter an int and then
     * read it in (using the Scanner named keyboard)
     *
     * @param prompt   The custom portion of the prompt
     * @return         The value 
     */
    private static int requestInt(String prompt)
    {
       int          value;
       
		 System.out.printf(prompt);
       value = keyboard.nextInt();

       return value;
    }//end requestInt    
}//end class
