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

namespace basic{
	struct user{
		string name;
		char per;
		int uid;
		string passwd;
	};
	struct gpio{
		short vol;
	};
	struct arg{
		string code;
		string input;
	};
	vector<string>split(string k){
		vector<string>ans;
		string tmp;
		for(int i=0;i<int(k.size());i++){
			if(k[i]==' '){
				if(tmp!="")ans.push_back(tmp);
			}else tmp+=k[i];
		}
		return ans;
	}
}

namespace sys{
	string name;
	int pnum,usernum;
	vector<basic::gpio>pins;
	vector<basic::user>userlist;
	basic::user* nwuser=nullptr;
	string nwdir="/";
	int errcode;
	void init(){
		ifstream read("config.conf");
		if(!read){
			ofstream w("config.conf");
			w<<"machine\n0\n1\nadmin R 12345678";
			name="machine";
			pnum=0;
			usernum=1;
			userlist.push_back({"admin",'R',1,"12345678"});
		}else{
			read>>name>>pnum;
			for(int i=1;i<=pnum;i++){
				basic::gpio tmp;
				read>>tmp.vol;
				pins.push_back(tmp);
			}
			read>>usernum;
			for(int i=1;i<=usernum;i++){
				basic::user tmp;
				read>>tmp.name>>tmp.per>>tmp.passwd;
				tmp.uid=i;
				userlist.push_back(tmp);
			}
		}
	}
}

namespace func{
	void readErr(int errcode=sys::errcode){
		if(errcode==1){
			cerr<<"ERR 1:无法阅读到DIR属性文件,可能需要重置文件夹\n使用rmdir来删除文件夹"<<endl;
		}
	}
	bool func_ls(vector<basic::arg>args){
		bool arglist[1]={};
		for(auto i:args){
			if(i.code=="#all"){
				arglist[0]=1;
			}
			
		}
		ifstream read("dirinfo.inf");
		if(!read){
			sys::errcode=1;
			return 0;
		}
		string name;
		string per;
		while(read>>name>>per){
			cout<<name;
			if(arglist[0])cout<<" "<<per;
			cout<<endl;
		}
		return 1;
	}
	void login(vector<basic::arg>args){
#ifdef _WIN32
		system("cls");
#else
		system("clear");
#endif
		basic::user tmp;
		cout<<"Username:";
		cin>>tmp.name;
		cout<<"\nPassword:";
		cin>>tmp.passwd;
		for(int i=1;i<=sys::usernum;i++){
			if(sys::userlist[i].name==tmp.name){
				if(sys::userlist[i].passwd==tmp.passwd){
					sys::nwuser=&sys::userlist[i];
					return;
				}else{
					cout<<"Password wrong!\n\n";
					return;
				}
			}
		}
		cout<<"Not found user "<<tmp.name<<"!\n\n";
		return;
	}
}

int main(){
	sys::init();
	while(1){
		while(sys::nwuser==nullptr)func::login({});
		cout<<sys::name<<" "<<sys::nwuser->name<<" "<<sys::nwuser->per<<" | "<<sys::nwdir<<" >";
		string command;
		getline(cin,command);
		vector<basic::arg>args;
		vector<string>spi=basic::split(command);
		for(int i=1;i<int(spi.size());i+=2){
			args.push_back({spi[i],spi[i+1]});
		}
		{
			if(spi[0]=="ls"){
				func::func_ls(args);
			}
		}
	}
}