import java.io.*;
import java.util.*;

/**
 * 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  Steve Danielson
 * @version 1.0
 */
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;       

       // 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);
          }
          catch (IOException ioe)
          {
             tape  = System.out;          
          }
       }
       // Otherwise, use System.out
       else
       {
          tape = System.out;          
       }
       
       // The application logic
       double[] prices; 
		 int[] categories; 
		 int length; 
		 int count; 
		 
       length = requestInt("Enter number of items: "); 
		 prices = new double[length];
		 categories = new int[length]; 
		 count = 0; 
		 while (count < length) 
		 {
		 	prices[count] = requestDouble("Enter the price of item " + (count + 1) + ": "); 
			categories[count] = requestCategory(); 
			count++; 
		 } // end while

       // Generate the required output
		 tape.println("Summary\n"); 
		 tape.println("Food: " + TaxCalculator.foodTax(prices, categories)); 
		 tape.println("Prepared: " + TaxCalculator.preparedfoodTax(prices, categories)); 
		 tape.println("Other: " + TaxCalculator.nonfoodTax(prices, categories)); 
    }

    /**
     * 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;
       
		 System.out.println("Enter 0 for nonfood, 1 for food, or 2 for prepared"); 
       category = requestInt("Enter the item's category: "); 

       return category;
    }

    /**
     * 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;
       boolean      test; 

		 System.out.print(prompt); 
		 value = keyboard.nextDouble(); 
		 
       return value;
    }

    /**
     * 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;
       boolean      test; 

		 System.out.print(prompt); 
		 value = keyboard.nextInt(); 
		 
       return value;
    }
}
