#include <iostream>
#include <string> 
#include <algorithm>
#include <sstream>
#include <list>
#include <string.h> 

using namespace std;


// 메뉴 구조체
struct sMenus
{
	int foodNumber;
	string foodName;
	int price;
};

struct sMenus sMenu[7] = { NULL };

// 주문 구조체
struct sOrders
{
	int id = 0;
	sMenus food = { };
	int foodQuantity = 0; // 음식의 수량
	int TableNumber = 0;     // 주문 테이블의 넘버
	int total_price = 0;   // 주문한 음식의 총 가격
	bool check = false;
};

//list<sOrders> orderList;

struct sOrders orders[1000] = {NULL}; // order 초기화
// 메뉴 배열
string MenuNames[] = { "그린샐러드","치킨샐러드","찹스테이크","티본스테이크","치즈파스타","치즈피자" };
// 메뉴 가격
int MenuPrice[] = { 18000, 19000, 32000, 30000, 17000, 15000 };

int totalIdAmount = 0;


// 입력 받은 str을 int로 변환할 수 있는지 판별하는 함수
bool IntDiscriminate(string str)
{
	return (str.find_first_not_of("0123456789") == std::string::npos);
}


// str 값을 int로 변환 해주는 함수
int ConvertStrToInt32(string str)
{
	int returnValue = 0;
	std::istringstream(str) >> returnValue;
	return returnValue;
}




// 시작시 초기화
void Init()
{
	sMenu[0].foodNumber = 0;
	sMenu[0].foodName = "없는 메뉴";
	sMenu[0].price = 0;

	for (int i = 1; i <= 6; i++)
	{
		sMenu[i].foodNumber = i;
		sMenu[i].foodName = MenuNames[i - 1];
		sMenu[i].price = MenuPrice[i - 1];
	}
}

// 메뉴를 시각적으로 보여주는 함수
void ShowMenu()
{
	for (int i = 1; i <= 6; i++)
	{
		cout << "\n";
		cout << "[" << sMenu[i].foodNumber << "]";
		cout << sMenu[i].foodName << " : ";
		cout << sMenu[i].price;
	}
}


void SelectMenu(int totalIdAmount)
{
	int ID = totalIdAmount;
	string inputStr = "Default";
	int SelectTalbeNumber = -1;
	int SelectFoodNumber = -1;
	int SelectFoodAmount = -1;
	
	

	while (true)
	{
		cout << "\n";
		inputStr = "defalt";
		SelectTalbeNumber = -1;
		cout << "\n주문할 테이블의 번호를 입력해주세요 (1 ~ 10) : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectTalbeNumber = ConvertStrToInt32(inputStr);

			if (SelectTalbeNumber > 0 && SelectTalbeNumber < 11)
			{
				break;
			}

			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;

		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;
		}
	}

	while (true)
	{
		inputStr = "defalt";
		SelectFoodNumber = -1;
		cout << "\n주문할 메뉴의 번호를 입력해주세요 : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectFoodNumber = ConvertStrToInt32(inputStr);

			if (SelectFoodNumber > 0 && SelectFoodNumber < 7)
			{
				break;
			}
			
			cout << "\n" << "입력값이 잘못되었습니다." << "\n";
			continue;
				
		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다." << "\n";
			continue;
		}
	}

	

	while (true)
	{
		inputStr = "defalt";
		SelectFoodAmount = -1;
		cout << "\n주문할 음식의 수량을 입력해주세요 : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectFoodAmount = ConvertStrToInt32(inputStr);

			if (SelectFoodAmount > 0)
			{
				break;
			}

			cout << "\n" << "입력값이 잘못되었습니다." << "\n";
			continue;
		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다." << "\n";
			continue;
		}
	}

	orders[ID].id = ID;
	orders[ID].food = sMenu[SelectFoodNumber];
	orders[ID].foodQuantity = SelectFoodAmount;
	orders[ID].TableNumber = SelectTalbeNumber;
	orders[ID].total_price = sMenu[SelectFoodNumber].price * SelectFoodAmount;
	orders[ID].check = false;



	cout << "\n----------------------------------------\n" << "주문서" << "\n----------------------------------------";
	cout << "\n 주문서의 id : " << ID;
	cout << "\n 테이블 번호 : " << SelectTalbeNumber;
	cout << "\n 주문 메뉴    : " << sMenu[SelectFoodNumber].foodName << " X " << SelectFoodAmount;
	cout << "\n 주문 가격    : " << sMenu[SelectFoodNumber].price << " X " << SelectFoodAmount << " = " << sMenu[SelectFoodNumber].price * SelectFoodAmount << " 원";
	cout << "\n---------------------------------------";
}

void SerachOrder()
{
	string inputStr = "Default";
	int SelectTalbeNumber = -1;

	while (true)
	{
		cout << "\n";
		inputStr = "defalt";
		SelectTalbeNumber = -1;
		cout << "\n확인할 테이블의 번호를 입력해주세요 (1 ~ 10) : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectTalbeNumber = ConvertStrToInt32(inputStr);

			if (SelectTalbeNumber > 0 && SelectTalbeNumber < 11)
			{
				break;
			}

			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;

		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;
		}
	}

	int totalPrice = 0;
	bool emptyCheck = false;
	for (int i = 1; i <= totalIdAmount; i++)
	{
		if (orders[i].TableNumber == SelectTalbeNumber)
		{
			if (!orders[i].check)
			{
				emptyCheck = true;
				totalPrice += orders[i].food.price * orders[i].foodQuantity;
				cout << "\n----------------------------------------\n" << " 주문서 " << orders[i].id << "\n----------------------------------------";
				cout << "\n 테이블 번호  : " << SelectTalbeNumber;
				cout << "\n 주문 메뉴    : " << orders[i].food.foodName << " X " << orders[i].foodQuantity;
				cout << "\n 주문 가격    : " << orders[i].food.price << " X " << orders[i].foodQuantity << " = " << orders[i].food.price * orders[i].foodQuantity << " 원";
			}
		}
	}

	if (!emptyCheck)
	{
		cout << "\n";
		cout << "\n----------------------------------------";
		cout << "\n  해당 테이블의 주문서는 비어있습니다.";
		cout << "\n  메뉴로 다시 이동합니다.";
		cout << "\n----------------------------------------";
		return;
	}
	cout << "\n";
	cout << "\n----------------------------------------";
	cout << "\n 총 금액은 : " << totalPrice << " 원 입니다.";
	cout << "\n----------------------------------------";

}

void Payment()
{
	string inputStr = "Default";
	int SelectTalbeNumber = -1;

	while (true)
	{
		cout << "\n";
		inputStr = "defalt";
		SelectTalbeNumber = -1;
		cout << "\n결제할 테이블의 번호를 입력해주세요 (1 ~ 10) : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectTalbeNumber = ConvertStrToInt32(inputStr);

			if (SelectTalbeNumber > 0 && SelectTalbeNumber < 11)
			{
				break;
			}

			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;

		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;
		}
	}

	int totalPrice = 0;
	bool emptyCheck = false;
	for (int i = 1; i <= totalIdAmount; i++)
	{
		if (orders[i].TableNumber == SelectTalbeNumber)
		{
			if (!orders[i].check)
			{
				emptyCheck = true;
				totalPrice += orders[i].food.price * orders[i].foodQuantity;
				cout << "\n----------------------------------------\n" << " 주문서 " << orders[i].id << "\n----------------------------------------";
				cout << "\n 테이블 번호  : " << SelectTalbeNumber;
				cout << "\n 주문 메뉴    : " << orders[i].food.foodName << " X " << orders[i].foodQuantity;
				cout << "\n 주문 가격    : " << orders[i].food.price << " X " << orders[i].foodQuantity << " = " << orders[i].food.price * orders[i].foodQuantity << " 원";
			}
		}
	}

	if (!emptyCheck)
	{
		cout << "\n";
		cout << "\n----------------------------------------";
		cout << "\n  해당 테이블의 주문서는 비어있습니다.";
		cout << "\n  메뉴로 다시 이동합니다.";
		cout << "\n----------------------------------------";
		cout << "\n";
		return;
	}
	cout << "\n";
	cout << "\n----------------------------------------";
	cout << "\n 총 금액은 : " << totalPrice << " 원 입니다.";
	cout << "\n----------------------------------------";




	inputStr = "Default";
	int SelectMoneyNumber = -1;

	while (true)
	{
		cout << "\n";
		inputStr = "defalt";
		SelectMoneyNumber = -1;
		cout << "\n 금액을 입력해주세요 : ";
		cin >> inputStr;
		if (IntDiscriminate(inputStr))
		{
			SelectMoneyNumber = ConvertStrToInt32(inputStr);

			if (SelectMoneyNumber > 0)
			{
				break;
			}

			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;

		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다.\n" << "\n";
			continue;
		}
	}


	if (totalPrice > SelectMoneyNumber)
	{
		cout << "\n";
		cout << "\n----------------------------------------";

		cout << "\n  지불한 금액이 " << totalPrice - SelectMoneyNumber << " 원 부족합니다.";
		cout << "\n  메뉴로 다시 이동합니다.";
		cout << "\n----------------------------------------";
		cout << "\n";
		
		return;

	}
	else if (totalPrice <= SelectMoneyNumber)
	{

		cout << "\n";
		cout << "\n----------------------------------------";
		cout << "\n  결제가 완료되었습니다.";
		cout << "\n  거스름돈은 " << SelectMoneyNumber - totalPrice << " 원 입니다.";
		cout << "\n  메뉴로 이동합니다.";
		cout << "\n----------------------------------------";
		cout << "\n";


		for (int i = 1; i <= totalIdAmount; i++)
		{
			if (orders[i].TableNumber == SelectTalbeNumber)
			{
				orders[i].check = true;
			}
		}
	}


}

int main()
{
	string MaininputStr = "Default";
	int MaininputInt = -1;

	Init();

	while (true)
	{
		cout << "\n\n\n----------------------------------------\n" << "           Lycos의 레스토랑" << "\n----------------------------------------\n";
		cout << "\n원하는 메뉴의 번호를 입력해주세요\n\n" << "1. 주문 입력\n" << "2. 주문 검색\n" << "3. 결제\n" << "0. 프로그램 종료\n" << "\n 메뉴의 번호 : ";
		
		cin >> MaininputStr;

		if (IntDiscriminate(MaininputStr))
		{
			MaininputInt = ConvertStrToInt32(MaininputStr);
		}
		else
		{
			cout << "\n" << "입력값이 잘못되었습니다. \n메뉴로 이동합니다." << "\n";
			continue;
		}


		switch (MaininputInt)
		{

		case 0:
			cout << "\n0.종료를 선택하셨습니다.\n";
			cout << "\n프로그램을 종료합니다.\n";
			return 0;

		case 1:
			cout << "\n1.주문 입력을 선택하셨습니다.\n";
			ShowMenu();
			totalIdAmount++;
			SelectMenu(totalIdAmount);
			break;

		case 2:
			cout << "\n2.주문 검색을 선택하셨습니다.\n";
			SerachOrder();
			break;

		case 3:
			cout << "\n3.결제를 선택하셨습니다.\n";
			Payment();
			break;

		default:
			cout << "\n해당 메뉴가 없습니다. \n다시 메뉴로 이동합니다.";
			break;
		}
	}
}