/**
 * A utility class that can be used to calculate sales
 * taxes on a collection of items
 *
 *
 * This work complies with the JMU Honor Code.
 *
 * @author Micheal Cottingham
 * @version 1.0 - 9/18/08
 */
public class TaxCalculator
{
    // These constants hold the values necessary
	 // to check if the item is a food, non-food
	 // or prepared food
    public static int NON_FOOD        = 0;
    public static int FOOD            = 1;
    public static int PREPARED_FOOD   = 2;
    
    /**
     * Calculate the tax on the (non-prepared) food items
     *
     * @param prices      The prices of all items purchases
     * @param categories  The corresponding categories of all items purchases
     * @return            The tax
     */
    public static double foodTax(double[] prices, int[] categories)
    {
       double tax;
       
       tax = 0.0;

       // Loop through each item in the categories array
		 // and accumulate the taxes
       for(int i = 0; i < categories.length; i++)
		 {
		    if(categories[i] == FOOD)
			 {
			     tax += StateTaxes.foodTax(prices[i]);
			 }
	    }

       return tax;       
    } // end foodTax

    /**
     * Calculate the tax on the non-food items
     *
     * @param prices      The prices of all items purchases
     * @param categories  The corresponding categories of all items purchases
     * @return            The tax
     */
    public static double nonfoodTax(double[] prices, int[] categories)
    {
       double tax;

       tax = 0.0;

       // Loop through each item in the categories array
		 // and accumulate the taxes
       for(int i = 0; i < categories.length; i++)
		 {
		    if(categories[i] == NON_FOOD)
			 {
			     tax += StateTaxes.salesTax(prices[i]);
			 }
	    }

       return tax;       
    } // end nonfoodTax
    
    /**
     * Calculate the tax on the prepared food items
     *
     * @param prices      The prices of all items purchases
     * @param categories  The corresponding categories of all items purchases
     * @return            The tax
     */
    public static double preparedfoodTax(double[] prices, int[] categories)
    {
       double tax;
       
       tax = 0.0;

       // Loop through each item in the categories array
		 // and accumulate the taxes
       for(int i = 0; i < categories.length; i++)
		 {
		     if(categories[i] == PREPARED_FOOD)
			  {
			      tax += LocalTaxes.preparedFoodTax(prices[i]);
			  }
	    }

       return tax;       
    } // end preparedfoodTax

    /**
     * Calculate the total value of all items purchased in
     * particular category
     *
     * @param prices      The prices of all items purchases
     * @param categories  The corresponding categories of all items purchases
     * @param categoryToInclude  The category of interest
     * @return            The total value of items in the given category
     */
    public static double total(double[] prices, int[] categories, 
                                int categoryToInclude)
    {
       double     total;
		 total = 0.00;

       // Loop through each item in the categories array
		 // and accumulate the prices
       for(int i = 0; i < categories.length; i++)
		 {
		      if(categories[i] == NON_FOOD && categoryToInclude == NON_FOOD)
				{
				   total += prices[i];
				}

            else if(categories[i] == FOOD && categoryToInclude == FOOD)
				{
				   total += prices[i];
				}

            else if(categories[i] == PREPARED_FOOD && categoryToInclude == PREPARED_FOOD)
				{
			      total += prices[i];
			   }
		  }

        return total;       
    } // end total

    /**
     * Determine if the given category is valid
     *
     * @param category   The category of interest
     * @return           true if the category is valid; false otherwise
     */
    public static boolean isValid(int category)
    {
       boolean     result;

       // Check the category for each of the constants
		 // if it doesn't match, then it is no good
       if(category == NON_FOOD || category == FOOD || category == PREPARED_FOOD)
		 {
		    result = true;
		 }

       else
		 {
          result = false;
		 }
       
       return result;       
    } // end isValid   
} // end class