#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 Order { int id; string customer; double total; string status; };
Order* findOrder(Order* ds,int n,int id){
for(int i=0;i<n;++i)if(ds[i].id==id)return &ds[i];
return nullptr;
}
void input(Order* ds,int n){
for(int i=0;i<n;++i){
cout<<"\nDon hang "<<i+1<<":\n";
while(true){if(!readInt("ID: ",ds[i].id))return;
if(findOrder(ds,i,ds[i].id)==nullptr)break;
cout<<"ID trung!\n";}
ds[i].customer=readLine("Ma khach hang: ");
do{if(!readDouble("Tong tien: ",ds[i].total))return;
if(ds[i].total<0)cout<<"Tong tien khong duoc am!\n";
}while(ds[i].total<0);
while(true){ds[i].status=readLine("Trang thai NEW/PROCESSING/SHIPPED/CANCELLED: ");
if(ds[i].status=="NEW"||ds[i].status=="PROCESSING"||
ds[i].status=="SHIPPED"||ds[i].status=="CANCELLED")break;
cout<<"Trang thai khong hop le!\n";}
}
}
void printOrder(const Order& o){
cout<<o.id<<" | Customer: "<<o.customer<<" | Total: "<<o.total
<<" | Status: "<<o.status<<'\n';
}
void findAndShow(Order* ds,int n,bool isStaff,const string& currentCustomer){
int id;if(!readInt("ID don hang: ",id))return;
Order* p=findOrder(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
if(!isStaff&&p->customer!=currentCustomer){cout<<"Khong co quyen xem don nay!\n";return;}
printOrder(*p);
}
void cancelOrder(Order* ds,int n,bool isStaff,const string& currentCustomer){
if(isStaff){cout<<"Chuc nang huy cua khach hang; staff dung chuc nang doi trang thai.\n";return;}
int id;if(!readInt("ID don muon huy: ",id))return;
Order* p=findOrder(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
if(p->customer!=currentCustomer){cout<<"Khong duoc huy don nguoi khac!\n";return;}
if(p->status!="NEW"){cout<<"Chi duoc huy don NEW!\n";return;}
p->status="CANCELLED";cout<<"Da huy don!\n";
}
void changeStatus(Order* ds,int n,bool isStaff){
if(!isStaff){cout<<"Chi staff duoc doi trang thai!\n";return;}
int id;if(!readInt("ID don hang: ",id))return;
Order* p=findOrder(ds,n,id);
if(!p){cout<<"Khong tim thay!\n";return;}
if(p->status=="CANCELLED"){cout<<"Don da huy, khong doi trang thai!\n";return;}
string status=readLine("Trang thai moi NEW/PROCESSING/SHIPPED/CANCELLED: ");
if(status!="NEW"&&status!="PROCESSING"&&status!="SHIPPED"&&status!="CANCELLED"){
cout<<"Trang thai khong hop le!\n";return;}
p->status=status;cout<<"Da cap nhat trang thai!\n";
}
bool login(Order* ds,int n,bool& isStaff,string& currentCustomer){
int role;if(!readInt("1.Staff 2.Customer: ",role))return false;
if(role==1){string pass=readLine("Mat khau staff: ");
if(pass=="S123"){isStaff=true;currentCustomer="";return true;}}
if(role==2){
// Khong tin ma customer nguoi dung tu khai don thuan.
// PIN mo phong la C + ma khach hang, khong dung cho he thong that.
string customer=readLine("Ma khach hang: ");
string pin=readLine("PIN (demo: C + ma khach hang): ");
bool exists=false;
for(int i=0;i<n;++i)if(ds[i].customer==customer)exists=true;
if(exists&&pin=="C"+customer&&!customer.empty()){
isStaff=false;currentCustomer=customer;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;
Order* ds=new Order[n];input(ds,n);
int mainChoice=-1;
do{
if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
if(mainChoice==1){bool isStaff=false;string currentCustomer;
if(!login(ds,n,isStaff,currentCustomer))continue;
int choice=-1;
do{
if(!readInt("\n1.Tim/xem don 2.Huy don cua minh 3.Staff doi trang thai 0.Dang xuat: ",choice))break;
switch(choice){
case 1:findAndShow(ds,n,isStaff,currentCustomer);break;
case 2:cancelOrder(ds,n,isStaff,currentCustomer);break;
case 3:changeStatus(ds,n,isStaff);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;
}