#include <iostream>
#include <string>
#include <vector>
using namespace std;


class CO_chitietmay{
private:
	string O_ma;
public:
	CO_chitietmay(){
		O_ma = "";
	}
	friend istream& operator >> (istream &is, CO_chitietmay &x){
		cout << "Nhap ma chi tiet may: ";
		is >> x.O_ma;
		fflush(stdin);
		return is;
	}
	friend ostream& operator << (ostream &os, CO_chitietmay x){
		os << "Ma chi tiet may la: " << x.O_ma << endl;
		return os;
	}
};
class C_chitietnho : public CO_chitietmay {
private:
	float trongluong;
	float giathanh;
public:
	C_chitietnho() : CO_chitietmay() {
		trongluong = 0;
		giathanh = 0;
	}
	float Getter_trongluong(){
		return this->trongluong;
	}
	float Getter_giathanh(){
		return this->giathanh;
	}
	friend istream& operator >> (istream &is, C_chitietnho &x){
		CO_chitietmay *cha = static_cast<CO_chitietmay *>(&x);
		is >> *cha;
		cout << "Nhap trong luong: ";
		is >> x.trongluong;
		cout << "Nhap gia thanh  : ";
		is >> x.giathanh;
		return is;
	}
	friend ostream& operator << (ostream &os, C_chitietnho x){
		CO_chitietmay cha = static_cast<CO_chitietmay>(x);
		os << cha;
		os << "Trong luong: " << x.trongluong << endl;
		os << "Gia thanh  : " << x.giathanh << endl;
		return os;
	}
};
class C_chitietphuc{
private:
	vector<C_chitietnho> chitietphuc;
public:
	friend istream& operator >> (istream &is, C_chitietphuc &x){
		bool check = false;
		int i = 0 , choose;
		do 
		{
			C_chitietnho a;
			cout << "Nhap Chi tiet don thu " << i + 1 << endl;
			is >> a;
			x.chitietphuc.push_back(a);
			cout << "Ban muon nhap tiep ko?: ";
			is >> choose;
			i++;
		} while (choose);
		return is;
	}
	friend ostream& operator << (ostream &os, C_chitietphuc x){
		for(int i = 0 ; i < x.chitietphuc.size() ; i++){
			os << "Chi tiet don thu "<< i + 1 << endl;
			os << x.chitietphuc[i] << endl;
		}
		return os;
	}
};
class Machines{
private:
	vector <C_chitietnho> danhsachnho; // chi tiet don
	vector <C_chitietphuc> danhsachphuc;
	float trongluong, giathanh;
public:
	Machines(){
		trongluong = 0;
		giathanh = 0;
	}
	void Nhap(){
		int choose;
		int i = 0, j = 0;
		do 
		{
			system("cls");
			cout << "Cac bo phan che tac ra 1 co may" << endl;
			cout << "+1. Nhap chi tiet don. " << endl;
			cout << "+2. Nhap chi tiet phuc. "<< endl;
			cout << "+3. Thoat" << endl;
			cout << "Ban chon: "; 
			cin >> choose;
			switch(choose){
			case 1 : 
				{
					cout << "Nhap chi tiet don thu " << i + 1 << endl;
					C_chitietnho x;
					cin >> x;
					danhsachnho.push_back(x);
					i++;
					break;
				}
			case 2 :
				{
					cout << "Nhap chi tiet phuc thu " << j + 1 << endl;
					C_chitietphuc x;
					cin >> x;
					danhsachphuc.push_back(x);
					j++;
					break;
				}
			}
		} while (choose != 3);
	}
	void Xuat()
	{
		cout << "Cau tao cua 1 co may gom: " << danhsachnho.size() << " Chi tiet nho vs : " << danhsachphuc.size() << " Chi tiet phuc"<< endl;
		for(int k = 0 ; k < danhsachnho.size() ; k++ ){
			cout <<"+Chi tiet don thu "<< k + 1 << endl << danhsachnho[k];
		}
		cout << "\n---------------------------------------------------------\n";
		for(int h = 0 ; h < danhsachphuc.size() ; h++){
			cout << "+Chi tiet phuc thu " << h + 1 << endl << danhsachphuc[h];
		}
		cout << "------------------Ket Thuc------------------------" << endl;
	}
	float trongluong_comay(){
		float Sum_trongluong = 0;
		float thietbinoi;
		// chi tiet don truoc;
		for(int i = 0 ; i < danhsachnho.size() ; i++){
			Sum_trongluong += danhsachnho[i].Getter_trongluong();
		}
		cout << "Thiet bi noi: ";
		cin >> thietbinoi;
		return Sum_trongluong + 0.1 * thietbinoi;
	}
	float giathanh_comay(){
		float conglaprap;
		float Sum_giathanh = 0;
		// chi tiet don truoc;
		for(int i = 0 ; i < danhsachnho.size() ; i++){
			Sum_giathanh += danhsachnho[i].Getter_giathanh();
		}
		cout << "Cong lap rap: ";
		cin >> conglaprap;
		return Sum_giathanh + 0.2 * conglaprap;
	}
};
int main()
{
	Machines a;
	a.Nhap();
	a.Xuat();
	cout << "\nTrong luong cua Machine(Co may): "<< a.trongluong_comay() << endl;
	cout << "\nGia thanh cua Machine(Co may)  : " << a.giathanh_comay() << endl;
	cout << endl;
	system("pause");
	return 0;
}