#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

class InventoryItem
{

		//char serialNumber[3];
		//int quantity;
		//double price;
		//double profitLoss;
	public:
		char serialNumber[3];
		int quantity;
		double price;
		double profitLoss;
		
	//	InventoryItem(): serialNumber(""),quantity(0),price(0)
	//	{}


		void putSerialNumber(char sn[])
		{
			strcpy(serialNumber,sn);
		}

		void putQuantity(int q)
		{
			quantity = q;
		}

		void puPrice(double p)
		{
			price = p;
		}
		
		void putProfitLoss(double pl)
		{
			profitLoss = pl;
		}

		char * getSerialNumber()
		{
			return serialNumber;
		}

		int getQuantity()
		{
			return quantity;
		}

		double getProfitLoss()
		{
			return profitLoss;
		}

		double getPrice()
		{
			return price;
		}
};

int getMenuChoice()
{
	int choice;

	cout << "Enter a selection: " << endl
	     << "1 for \"Add Record\"" << endl
		 << "2 for \"Delete Record\"" << endl
		 << "3 for \"Change Record\"" << endl
		 << "4 for \"Display File\"" << endl
		 << "5 for \"Quit\"" << endl;

	cin >> choice;

	return choice;
}

int validRecNum(long recNum)
{
	if(recNum < 1L || recNum > 99L)
	{
		cout << "Record number must be from 1 to 99.";
		return 0;//0 is false?
	}
	else 
	{
		return 1;//1 is true?
	}
}




void addRecord(fstream& file)
{
	InventoryItem invItem;
	InventoryItem tempInvItem;
	char tempSerialNum[3];
	int tempQuantity;
	double tempPrice;
//	double tempProfitLoss;
	long recNum;


	cout << "Enter data for the new record: " << endl
		 << "Serial Number: " << endl;
	cin >> tempSerialNum;

	
	recNum = atol(tempSerialNum);
	if(!validRecNum(recNum))
		return;

	invItem.putSerialNumber(tempSerialNum);

	cout << "Quantity: " << endl;
	cin >> tempQuantity;
	invItem.putQuantity(tempQuantity);

	cout << "Price: " << endl;
	cin >> tempPrice;
	invItem.puPrice(tempPrice);

	file.seekp((recNum - 1) * sizeof(InventoryItem), ios::beg);
	file.read((char *)&tempInvItem, sizeof(InventoryItem));

	if (strcmp(tempInvItem.serialNumber, "") == 0)
	{
		file.seekp(-(long)sizeof(InventoryItem), ios::cur);
		file.write((char *)&invItem,sizeof(InventoryItem));
		cout << "Record " << invItem.getSerialNumber() << " added to file.";
	}
	//else 
	//	cout << "Inventory item already exists.";
}

void deleteRecord(fstream& file)
{
	InventoryItem invItem;
	InventoryItem tempInvItem;
	InventoryItem nullItem;
	nullItem.puPrice(0);
	nullItem.putQuantity(0);
	nullItem.putSerialNumber("");

	long recNum;

	cout << "Enter the number of the record to delete.";
	cin >> recNum;

	if(!validRecNum(recNum))
		return;

	file.seekp((recNum - 1) * sizeof(InventoryItem), ios::beg);
	file.read((char *)&tempInvItem, sizeof(InventoryItem));

	if (strcmp(invItem.serialNumber, "") == 0)
	{
		cout << "Record does not exist. Canot be deleted.";
	}
	else
	{
		file.seekp(-(long)sizeof(InventoryItem), ios::cur);
		file.write((char *)&nullItem,sizeof(InventoryItem));
		cout << "Record " << recNum << " deleted from file.";
	}


}

int getChange()
{
	int change;

	cout << "What do you wish to change?" << endl;
	cout << "1 for quantity" << endl
		 << "2 for price" << endl
		 << "3 to write changes" << endl;

	cin >> change;

	return change;
}

void changeRecord(fstream& file)
{
	InventoryItem invItem;
//	InventoryItem tempInvItem;
	long recNum;
	int change;
	bool quit = false;
	int tempQuantity;
	double tempPrice;

	cout << "Enter the number of the record to change.";
	cin >> recNum;

	if(!validRecNum(recNum))
		return;

	file.seekp((recNum - 1) * sizeof(InventoryItem), ios::beg);
	file.read((char *)&invItem, sizeof(InventoryItem));

	if (strcmp(invItem.serialNumber, "") == 0)
	{
		cout << "Record does not exist. Cannot be changed.";
	}
	 
	
		cout << "The selected record's contents are as follows:" << endl;
		cout << setw(20) << "Serial Number" 
			 << setw(20) << "Quantity"
			 << setw(20) << "Price" << endl;
		cout << setw(20) << invItem.getSerialNumber()
			 << setw(20) << invItem.getQuantity()
			 << setw(20) << invItem.getPrice();

		do
		{
			change = getChange();
			
			switch(change)
			{
				case 1:
					cout << "Enter new quantity:" << endl;
					cin >> tempQuantity;
					invItem.putQuantity(tempQuantity);
					break;
				case 2:
					cout << "Enter new price:" << endl;
					cin >> tempPrice;
					invItem.puPrice(tempPrice);
					break;
				case 3:
					quit = true;
					file.seekp(-(long)sizeof(InventoryItem), ios::cur);
					file.write((char *)&invItem,sizeof(InventoryItem));
					cout << "Record " << recNum << " written" << endl;
					break;
				default:
					cout << "Invalid choice" << endl;
					break;
			}
		}
		while(quit = false);
}
		
void display(fstream& file)
{
	InventoryItem invItem;
	long recNum;
	long recCount = 0L;

	file.seekp(0L,ios::beg);

	cout << setw(20) << "Serial Number"
		 << setw(20) << "Quantity" 
		 << setw(20) << "Price"
		 << setw(20) << "Profit & Loss"
		 << setw(20) << "Overall Item Price"
		 << setw(20) << "Overall Profit/Loss" << endl;

	for(recNum = 1L; recNum <= 99L;recNum++)
	{
		file.read( (char *) &invItem, sizeof(InventoryItem) );

		if (strcmp(invItem.getSerialNumber(), "") != 0)
		{
			cout << setw(20) << invItem.getSerialNumber() 
				 << setw(20) << invItem.getQuantity()
				 << setw(20) << invItem.getPrice() << endl;
			recCount++;
		}
	}
		cout << "File contains " << recCount << " records.";
}

void main()
{
	int choice;
	bool quit = false;

	fstream in_file;
	
	InventoryItem invItem;
	invItem.puPrice(0);
	invItem.putQuantity(0);
	invItem.putSerialNumber("");

	in_file.open("invtestfile.txt", ios::in | ios::binary);

	if(in_file.fail())
	{
		in_file.open("invtestfile.txt", ios::out | ios::binary);

		for(long recNum = 1L; recNum <=99;recNum++)
		{
			in_file.write(  (char *)&invItem,sizeof(invItem));
		}

		cout << "New empty file created.";
	}

	in_file.close();

	in_file.open("invtestfile.txt",ios::in|ios::out|ios::binary);

	do
	{
		choice = getMenuChoice();

		switch(choice)
		{
		case 1:
			addRecord(in_file);
			break;
		case 2:
			deleteRecord(in_file);
			break;
		case 3:
			changeRecord(in_file);
			break;
		case 4:
			display(in_file);
			break;
		case 5:
			quit = true;
			break;
		}
	}
	while(quit =false);

	in_file.close();
}

		  






