#include <iostream>
#include <string>
#include <limits>
using namespace std;
bool readInt(const string& msg, int& x) {
while (true) {
cout << msg;
if (cin >> x) return true;
if (cin.eof()) return false;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Phai nhap so nguyen!\n";
}
}
bool readDouble(const string& msg, double& x) {
while (true) {
cout << msg;
if (cin >> x) return true;
if (cin.eof()) return false;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Phai nhap so!\n";
}
}
string readLine(const string& msg) {
cout << msg;
string s;
getline(cin >> ws, s);
return s;
}
struct Product { int id; string name; double price; int quantity; };
Product* findProduct(Product* products,int n,int id) {
for(int i=0;i<n;++i) if(products[i].id==id) return &products[i];
return nullptr;
}
void input(Product* ds,int n) {
for(int i=0;i<n;++i) {
cout<<"\nSan pham "<<i+1<<":\n";
while(true) {
if(!readInt("ID: ",ds[i].id)) return;
if(findProduct(ds,i,ds[i].id)==nullptr) break;
cout<<"ID trung!\n";
}
ds[i].name=readLine("Ten: ");
do {if(!readDouble("Gia: ",ds[i].price)) return;
if(ds[i].price<0)cout<<"Gia khong duoc am!\n";
}while(ds[i].price<0);
do {if(!readInt("So luong: ",ds[i].quantity)) return;
if(ds[i].quantity<0)cout<<"So luong khong duoc am!\n";
}while(ds[i].quantity<0);
}
}
void show(Product* ds,int n) {
for(int i=0;i<n;++i) cout<<ds[i].id<<" | "<<ds[i].name
<<" | Gia: "<<ds[i].price<<" | Ton: "<<ds[i].quantity<<'\n';
}
void search(Product* ds,int n) {
int id;if(!readInt("ID tim: ",id))return;
Product* p=findProduct(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
cout<<p->id<<" | "<<p->name<<" | "<<p->price<<" | "<<p->quantity<<'\n';
}
void buy(Product* ds,int n) {
int id,k;if(!readInt("ID mua: ",id))return;
Product* p=findProduct(ds,n,id);
if(p==nullptr){cout<<"San pham khong ton tai!\n";return;}
if(!readInt("So luong mua k: ",k))return;
if(k<=0||k>p->quantity){cout<<"So luong mua khong hop le!\n";return;}
p->quantity-=k;
cout<<"Mua thanh cong! Con "<<p->quantity<<'\n';
}
void setPrice(Product* ds,int n,bool isManager) {
if(!isManager){cout<<"User khong duoc doi gia!\n";return;}
int id;if(!readInt("ID sua gia: ",id))return;
Product* p=findProduct(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
double price;if(!readDouble("Gia moi: ",price))return;
if(price<0){cout<<"Gia khong hop le!\n";return;}
p->price=price;cout<<"Da cap nhat gia!\n";
}
bool login(bool& isManager) {
int role;if(!readInt("1.Manager 2.User: ",role))return false;
if(role==2){isManager=false;return true;}
if(role==1){string pass=readLine("Mat khau manager: ");
if(pass=="M123"){isManager=true;return true;}}
cout<<"Dang nhap that bai!\n";return false;
}
int main(){
int n;if(!readInt("Nhap n (1..1000): ",n)||n<1||n>1000)return 0;
Product* ds=new Product[n];input(ds,n);
int mainChoice=-1;
do {
if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
if(mainChoice==1){bool isManager=false;
if(!login(isManager))continue;
int choice=-1;
do{
if(!readInt("\n1.Hien thi 2.Tim 3.Mua 4.Sua gia 0.Dang xuat: ",choice))break;
switch(choice){
case 1:show(ds,n);break;
case 2:search(ds,n);break;
case 3:buy(ds,n);break;
case 4:setPrice(ds,n,isManager);break;
case 0:break;
default:cout<<"Lua chon sai!\n";
}
}while(choice!=0&&!cin.eof());
}else if(mainChoice!=0)cout<<"Lua chon sai!\n";
}while(mainChoice!=0&&!cin.eof());
delete[] ds;ds=nullptr;return 0;
}