
#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;
}

