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

// Theo de struct Account co 4 truong; them mang locked[] de luu trang thai khoa.
struct Account { int id; string username, password, role; };
int findIndex(Account* ds,int n,int id){
    for(int i=0;i<n;++i)if(ds[i].id==id)return i;
    return -1;
}
void input(Account* ds,bool* locked,int n){
    for(int i=0;i<n;++i){
        cout<<"\nTai khoan "<<i+1<<":\n";
        while(true){if(!readInt("ID: ",ds[i].id))return;
            if(findIndex(ds,i,ds[i].id)==-1)break;
            cout<<"ID trung!\n";}
        while(true){
            ds[i].username=readLine("Username: ");
            bool duplicate=false;
            for(int j=0;j<i;++j)if(ds[j].username==ds[i].username)duplicate=true;
            if(!duplicate&&!ds[i].username.empty())break;
            cout<<"Username trung hoac rong!\n";
        }
        ds[i].password=readLine("Password (demo): ");
        while(true){ds[i].role=readLine("Role (admin/user): ");
            if(ds[i].role=="admin"||ds[i].role=="user")break;
            cout<<"Role khong hop le!\n";}
        locked[i]=false;
    }
}
int login(Account* ds,bool* locked,int n){
    string username=readLine("Username: ");
    string password=readLine("Password: ");
    for(int i=0;i<n;++i){
        if(ds[i].username==username&&ds[i].password==password){
            if(locked[i]){cout<<"Tai khoan da bi khoa!\n";return -1;}
            return i;
        }
    }
    cout<<"Dang nhap that bai!\n";return -1;
}
void showAll(Account* ds,bool* locked,int n,int currentIndex){
    if(ds[currentIndex].role!="admin"){
        cout<<"Chi admin xem danh sach tai khoan!\n";return;
    }
    for(int i=0;i<n;++i){
        cout<<ds[i].id<<" | "<<ds[i].username<<" | "<<ds[i].role
            <<" | "<<(locked[i]?"LOCKED":"ACTIVE")<<'\n';
        // Khong hien thi password.
    }
}
void viewAccount(Account* ds,int n,int currentIndex){
    int id;if(!readInt("ID can xem: ",id))return;
    int idx=findIndex(ds,n,id);
    if(idx==-1){cout<<"Khong tim thay!\n";return;}
    if(ds[currentIndex].role!="admin"&&idx!=currentIndex){
        cout<<"Khong duoc xem tai khoan nguoi khac!\n";return;
    }
    cout<<"ID: "<<ds[idx].id<<" | Username: "<<ds[idx].username
        <<" | Role: "<<ds[idx].role<<'\n';
}
void changePassword(Account* ds,int currentIndex){
    // User va admin chi duoc doi mat khau cua CHINH MINH.
    string old=readLine("Mat khau hien tai: ");
    if(old!=ds[currentIndex].password){cout<<"Mat khau cu sai!\n";return;}
    string fresh=readLine("Mat khau moi: ");
    if(fresh.empty()){cout<<"Khong duoc rong!\n";return;}
    ds[currentIndex].password=fresh;
    cout<<"Da doi mat khau!\n";
}
void lockAccount(Account* ds,bool* locked,int n,int currentIndex){
    if(ds[currentIndex].role!="admin"){
        cout<<"Chi admin duoc khoa tai khoan!\n";return;
    }
    int id;if(!readInt("ID can khoa: ",id))return;
    int idx=findIndex(ds,n,id);
    if(idx==-1){cout<<"Khong tim thay!\n";return;}
    if(idx==currentIndex){cout<<"Khong khoa tai khoan dang su dung!\n";return;}
    locked[idx]=true;cout<<"Da khoa tai khoan!\n";
}
int main(){
    int n;if(!readInt("Nhap n (1..1000): ",n)||n<1||n>1000)return 0;
    Account* ds=new Account[n];bool* locked=new bool[n];
    input(ds,locked,n);
    int mainChoice=-1;
    do{
        if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
        if(mainChoice==1){
            int currentIndex=login(ds,locked,n);
            if(currentIndex<0)continue;
            int choice=-1;
            do{
                if(!readInt("\n1.Danh sach 2.Xem tai khoan 3.Doi password 4.Khoa tai khoan 0.Dang xuat: ",choice))break;
                switch(choice){
                    case 1:showAll(ds,locked,n,currentIndex);break;
                    case 2:viewAccount(ds,n,currentIndex);break;
                    case 3:changePassword(ds,currentIndex);break;
                    case 4:lockAccount(ds,locked,n,currentIndex);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;
    delete[] locked;locked=nullptr;
    return 0;
}

