// Program to handle inventory for a small company
//  File: ch7inv1.cpp

#include <iostream.h>
#include <conio.h>

const  int MAX_ITEMS = 5;

typedef int InventoryArray[MAX_ITEMS];

void DisplayWelcomeMessage();
void DisplayClosingMessage();
void OutputInventory(const InventoryArray items);  // const used to protect the array from being changed
void InputInventory(InventoryArray items);
void ProcessChoices();

void OutputOneInventoryAmount(int amount, int itemCode);
void ChangeOneInventoryAmount(InventoryArray items, int itemCode);
char GetItemCode();

void DeductInventory(InventoryArray items, int itemCode);


void AddInventory(InventoryArray items, int itemCode);

char GetUsersChoice();


void main()
{


        DisplayWelcomeMessage();
        ProcessChoices();
        DisplayClosingMessage();
}



void DisplayWelcomeMessage()
{               cout << "\n\n\n\n\n\n\n\n\n\n";
        cout << "                 W E L C O M E   T O\n\n";
        cout << "                         T H E\n\n";
        cout << "             E C L P S E   I N V E N T O R Y  P R O G R A M\n\n\n\n\n\n";


}

void DisplayClosingMessage()
{   cout << "           T H A N K S   F O R  S T O P P I N G   B Y\n\n\n\n\n\n";
}

void ProcessChoices()
{
        InventoryArray itemInventory;

        char choice;
        int itemCode;

        InputInventory(itemInventory);   // Create the initial inventory

        bool done = false;

        choice = GetUsersChoice();
        while (!done)
        {
                switch (choice)
                {       case 'L':  // List Inventory
                        case 'l':
                                OutputInventory(itemInventory);
                                break;

                        case 'S':  // Single product listed
                        case 's':
                                itemCode = GetItemCode();
                                while ((itemCode < MAX_ITEMS) && (itemCode >= 0))
                                // check to make sure code is valid - user is told to enter neg # to stop
                                {       OutputOneInventoryAmount(itemInventory[itemCode], itemCode);
                                        itemCode = GetItemCode();
                                        cout <<  "\n\n\n";
                                }
                                break;
                        case 'C':
                        case 'c':
                                itemCode = GetItemCode();
                                while ((itemCode < MAX_ITEMS) && (itemCode >= 0))
                                // check to make sure code is valid - user is told to enter neg # to stop
                                {       ChangeOneInventoryAmount(itemInventory, itemCode);
                                        itemCode = GetItemCode();
                                        cout <<  "\n\n\n";
                                }
                                break;
                        case 'A': // Add to inventory
                        case 'a':
                                itemCode = GetItemCode();
                                while ((itemCode < MAX_ITEMS) && (itemCode >= 0))
                                // check to make sure code is valid - user is told to enter neg # to stop
                                {       AddInventory(itemInventory, itemCode);
                                        itemCode = GetItemCode();
                                        cout <<  "\n\n\n";
                                }
                                break;
                        case 'D': // Deduct from inventory
                        case 'd':
                                itemCode = GetItemCode();
                                while ((itemCode < MAX_ITEMS) && (itemCode >= 0))
                                // check to make sure code is valid - user is told to enter neg # to stop
                                { DeductInventory(itemInventory, itemCode);
                                        itemCode = GetItemCode();
                                        cout << "\n\n\n";
                                }
                                break;
                        case 'Q':
                        case 'q':
                                cout << "Do you want to really want top quit (Y) or (N)\n";
                                char answ;
                                cin >> answ;
                                if ((answ =='Y') || (answ == 'y'))
                                {
                                        done = true;
                                }

                                break;
                        default:
                                cout << "Invalid choice. Please Select again.\n\n";
                } // end switch
               if (!done)
                {
                        choice = GetUsersChoice();
                }

        } // end while
}

char GetUsersChoice()
{  char choice;
        cout <<  "\n\n\n\n";
        cout << "Please indicate what you wish to do\n";
        cout << "   <L> to List all the inventory\n";
        cout << "   <S> to get the inventory of one item\n";
        cout << "   <D> to deduct from the inventory of an item\n";
        cout << "   <A> to add to the inventory of an item\n";
        cout << "   <C> to change the inventory of an item\n";
        cout << "   <Q> to quit\n";
        cin >> choice;
        return choice;
}


char GetItemCode()
{       int code;
        cout << "Please enter the code for the item you wish to work with\n";
        cout << "Enter a negative number to indicate you are finished\n";
        cin >> code;
        while (code > MAX_ITEMS -1) // check for code that is too high
        {       cout << "Invalid item code. Please enter a valid code.\n";
                cin >> code;
        }
//      cin.ignore(1);
        return code;

}


void OutputOneInventoryAmount(int amount, int itemCode)
{       cout << endl << endl << "The inventory amount for item " << itemCode
                          << " is: "                              <<  amount << endl << endl;
}

void OutputInventory(const InventoryArray items)
{
        cout << "\n\n\n\n\n";
        for (int itemCode = 0; itemCode < MAX_ITEMS;  itemCode++)
        {
                cout << "The inventory amount for item " << itemCode
                          << " is: "                              <<  items[itemCode] << endl;
        }
        cout << "\n\n\n\n\n\n";
}


void InputInventory(InventoryArray items)
{       int itemAmount;
        for (int itemCode = 0; itemCode < MAX_ITEMS;  itemCode++)
        {
                cout << "Please enter the inventory count for item " << itemCode << ": ";
                cin >> itemAmount;
                items[itemCode] = itemAmount;
        }
}

void ChangeOneInventoryAmount(InventoryArray items, int itemCode)
{       int amount;
        cout << "Please enter the new amount in the inventory\n";
        cin >> amount;
        items[itemCode] = amount;
}

void DeductInventory(InventoryArray items, int itemCode)
{       int amount;
        cout << "Please enter the amount sold of item\n";
        cin >> amount;
        items[itemCode] -= amount;
}


void AddInventory(InventoryArray items, int itemCode)
{       int amount;
        cout << "Please enter the amount to add of item\n";
        cin >> amount;
        items[itemCode] += amount;
}