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  Your Name
 * @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;
       double[]       itemPrices;
       int[]          itemCategory;  
       double	      nonFoodTax,foodTax,preparedFoodTax;     


       
       // 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;          
       }
       int items;
       items = 0;
       
       items = requestInt("Please enter the number of items:  ");
       
       itemPrices = new double[items];
       itemCategory = new int[items];

       for (int i = 0; i < itemPrices.length; i++)
       {
           itemCategory[i] = requestCategory();
           itemPrices[i] = requestDouble("Enter the price:  ");
       }

       System.out.println("\nYou have entered the following values:");
       for (int i = 0; i < itemPrices.length; i++)
       {
	   System.out.println("Category:  " + itemCategory[i] + " with price:  " + itemPrices[i]);
       }
       System.out.println();

       nonFoodTax = TaxCalculator.nonFoodTax(itemPrices,itemCategory);
       foodTax = TaxCalculator.foodTax(itemPrices,itemCategory);
       preparedFoodTax = TaxCalculator.preparedFoodTax(itemPrices,itemCategory);
       System.out.printf("%10s","Summary\n");
       System.out.printf("%10s","Food:  ");
       System.out.printf("%8.4f",foodTax);
       System.out.printf("%10s","\nPrepared:  ");
       System.out.printf("%8.4f",preparedFoodTax);
       System.out.printf("%10s","\nOther:  ");
       System.out.printf("%8.4f",nonFoodTax);     

       System.out.println("The program has ended normally.");  
    }


    /**
     * 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;

       category = -1;

       System.out.print("Enter 0 for non-food, 1 for food, or 2 for prepared:  ");
       category = keyboard.nextInt();        
           while (category < 0 || category > 2)
           {
                System.out.print("You have entered an invalid category.  Please enter 0 for non-food " + 
	             ", 1 for food, or 2 for prepared:  ");
	        category = keyboard.nextInt();
	   }
       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;
       
       value = 0.0;

       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;
       
       value = 0;

       System.out.print(prompt);
       try
       {
 	  value = keyboard.nextInt();
       }
       catch (InputMismatchException ime)
       {
          System.out.println("You have entered an invalid number.");
       }


       return value;
    }    
}
