#include <iostream>
#include <list>

/* CIS 280 Lab 7 - Jonathan LaZor
Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
i

Enter ID number of new data: 3
Enter name of new data: c

ID Number: 3 Name: c

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
i

Enter ID number of new data: 4
Enter name of new data: d

ID Number: 3 Name: c
ID Number: 4 Name: d

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
u

Enter ID number of data to update: 4
Enter name of new data: b

ID Number: 3 Name: c
ID Number: 4 Name: b

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
d

Enter ID number of data to delete: 4

ID Number: 3 Name: c

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
u

Enter ID number of data to update: 0

ID entered to update is not in the list
ID Number: 3 Name: c

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
d

Enter ID number of data to delete: 0

ID entered to delete is not in the list
ID Number: 3 Name: c

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
i

Enter ID number of new data: 3

ID entered to insert is already in the list
ID Number: 3 Name: c

Inventory List
Enter an option:
I       Insert
U       Update
D       Delete
Q       Quit
q
Press any key to continue*/

using namespace std;

class Inventory {
	unsigned int id;
	char name[80];
public:
	Inventory() {}
	operator <(Inventory& data) {return id < data.id;}
	operator !=(unsigned int num) {return id != num;}
	void setid(const unsigned int number) {id = number;}
	void setname(char* const sz) {strcpy(name, sz);}
	friend ostream& operator<<(ostream& out, Inventory& data);
};

ostream& operator<<(ostream& out, Inventory& data) {
	return out << "ID Number: " << data.id << " Name: " << data.name;
}

int main() {
	unsigned int number;
	char ch;
	char sz[80];
	Inventory data;
	list<Inventory> List;
	list<Inventory>::iterator i, tail;
	i = List.begin();
	tail = List.end();

	while(true) {
		try {
			for(i = List.begin(); i != tail; i++) cout << *i << '\n';
			if(i != List.begin()) {
				i = List.begin();
				cout << '\n';
			}

			cout << "Inventory List\nEnter an option:\nI\tInsert\nU\tUpdate\nD\tDelete\nQ\tQuit\n";
			cin >> ch;
			switch(ch) {
			case 'I':
			case 'i':
				cout << "\nEnter ID number of new data: ";
				cin >> number;
				data.setid(number);
				while(*i < data && i != tail) i++;
				if(*i != number) {
					cout << "Enter name of new data: ";
					cin >> sz;
					data.setname(sz);
					List.insert(i, data);
				}
				else throw "ID entered to insert is already in the list";
				break;
			case 'U':
			case 'u':
				cout << "\nEnter ID number of data to update: ";
				cin >> number;
				while(*i != number && i != tail) i++;
				if(i == tail) throw "ID entered to update is not in the list";
				cout << "Enter name of new data: ";
				cin >> sz;
				i->setid(number);
				i->setname(sz);
				break;
			case 'D':
			case 'd':
				cout << "\nEnter ID number of data to delete: ";
				cin >> number;
				while(*i != number && i != tail) i++;
				if(i == tail) throw "ID entered to delete is not in the list";
				List.erase(i);
				break;
			case 'Q':
			case 'q':
				return 1;
			default:
				break;
			}
			cout << '\n';
		}
		catch(const char* const sz) {cout << '\n' << sz << '\n';}
		catch(...) {cout << "\nError\n";}
	}

	return 1;
}