#ifndef DELIVERYSYSTEM_H
#define DELIVERYSYSTEM_H
#include <string>

using namespace std;

class Menu
{
	protected:
		string name;
		double price;
	public:
		Menu(string="", double=0.00);
		void showOption();
		void setName(string);
		void setPrice(double);
		string getName();
		double getPrice(); 
};

class Breakfast:public Menu
{
	public:
		Breakfast();
		Breakfast(Menu*,int);
};

class Lunch:public Menu
{
	public:
		Lunch();
		Lunch(Menu*, int);
};

class Dinner:public Menu
{
	public:
		Dinner();
		Dinner(Menu*, int);
};

class Payment
{
	protected:
		float amount;
	public:
		Payment(float a=0)
		{
			amount = a;
		}
		void setAmount(float am)
		{
			amount = am;
		}
		float getAmount()
		{
			return amount;
		}
};

class Cash : public Payment
{
	protected:
		float paid;
		float change;
	public:
		void getChange(float a);
};

class Card : public Payment
{
	protected:
		string cardNo;
		string cvv;
	public:
		void authorise();
};

class OnlineBanking : public Payment
{
	protected:
		string bank;
		string username;
		string password;
	public:
		void authorise();
};

class Order:public Menu
{
	protected:
		int quantity;
		Payment *payment;
	public:
		Order();
		Order(Menu*, int, int);
		Order(Breakfast*, int, int);
		Order(Lunch*, int, int);
		Order(Dinner*, int, int);
		double getSubtotal();
		void setQuantity(int);		
		int getQuantity() const
			{ return quantity;	}
		void addAmount(float);
		float displayPrice()
		{
			return payment->getAmount();
		}
};

class Shop
{
	protected:
		string name;
		string address;
		Menu *menu;
		Breakfast *breakfastMenu;
		Lunch *lunchMenu;
		Dinner *dinnerMenu;
	public:
		Shop(string="", string="");
		void setShopName(string);
		void setAddress(string);
		string getName();
		string getAddress();
		void showMenu();
		void setFoodMenu();
		void setBreakfastMenu();
		void setLunchMenu();
		void setDinnerMenu();
		void displayAllMenu();
		void displayBreakfastMenu();
		void displayLunchMenu();
		void displayDinnerMenu();
		Menu *getAllMenu() { return menu;	}
		Breakfast *getBreakfastMenu() { return breakfastMenu;	}
		Lunch *getLunchMenu() { return lunchMenu;	}
		Dinner *getDinnerMenu() { return dinnerMenu;	}
};

class Account
{
	protected:
		string username;
		string password;
	public:
		Account();
		void registration(string, string);
		bool login();
};

class User
{
	protected:
		string fullName;
		string phone;
		Account *account;
	public:
		User();
		void mainPage();
		bool verify();
		void setInfo(string, string);
		virtual void getInfo();
		void registration();
};

class Customer:public User
{
	protected:
		string address;
		int numOrder;
		Order *orderList;
	public:
		Customer();
		void addOrder(Order*);
		double getTotal();
		void setInfo(string);
		float displayOrder();
		void getInfo();
};

class Seller:public User
{
	protected:
		Shop *shop;
		string vehicleNo;
	public:
		Seller(Shop*, string);
		void getInfo();
};



#endif
