package org.zhios.website.admin.model;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.servlet.http.HttpSession;

import org.zhios.website.admin.data.User;


public class UserManager {
	private static String UserDataFile=SysConfig.SettingPath+"data/sysusers.tmdb";
	
	public static boolean checkUser(HttpSession session){
    	if(session==null){
    		return false;
    	}
    	Object user=session.getAttribute("username");
    	Object token=session.getAttribute("token");
    	if(user==null||token==null){
    		return false;
    	}
    	String tokenuser = JwtUtil.getUser((String)token);
    	return tokenuser.equals((String)user);
	}
	
	public String UserLogin(String pusername,String ppassword){
		if(pusername==null||ppassword==null) return "";
				
		//user login.
		String role="";
		try {
			File userfile=new File(UserDataFile);
			if(userfile.exists()){
				//read every user to compare with inparameter.
				FileInputStream istream=new FileInputStream(userfile);

				long filelength=userfile.length();
				User userbuff=new User();
				byte outlength[]=new byte[1],outbuffer[];
				int offset=0;
				while(offset<filelength){
					if(istream.read(outlength,0,1)==1){
						int outlen=outlength[0];
						outbuffer=new byte[outlen];
						istream.read(outbuffer,0,outlen);
						userbuff.setUserByByte(outbuffer);
						
						String dstname=userbuff.getUsername();
						String dstpw=userbuff.getPassword();
						String password=MD5Operator.getMD5Digest(ppassword);
						if(dstname.equals(pusername)&&dstpw.equals(password)){
							role=userbuff.getRole();
							break;
						}
						offset+=outlen+1;
					}
					else break;
				}
				istream.close();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return role;
	}
	
	public String ReadUserList(String prole){
		String result="";
		
		try {
			File userfile=new File(UserDataFile);
			if(userfile.exists()){
				FileInputStream istream=new FileInputStream(userfile);
								
				User userbuff=new User();
				byte outbuffer[];
				int offset=0;
				long filelength=userfile.length();
				while(offset<filelength){
					outbuffer=new byte[1];
					if(istream.read(outbuffer,0,1)==1){
						int outlen=outbuffer[0];
						outbuffer=new byte[outlen];
						istream.read(outbuffer,0,outlen);
						userbuff.setUserByByte(outbuffer);
						if(userbuff.getRole().equals(prole)){
							result+="<div id='user_"+userbuff.getUsername()+"' style='width:180px;height:40px;float:left'><input type='checkbox' name='user' value='"+userbuff.getUsername()+"'>&nbsp;" +
									"<img src='img/user.gif' alt=''>&nbsp;"+userbuff.getUsername()+"</div>";
						}
	
						offset+=outlen+1;
					}
					else break;
				}
				
				istream.close();
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}

	public boolean AddUser(String pusername,String ppassword,String prole){
		boolean result=false;
		
		String password=MD5Operator.getMD5Digest(ppassword);
		if(password==null||password.isEmpty()) return result;
		
		try {
			File userfile=new File(UserDataFile);
			if(userfile.exists()){
				FileOutputStream ostream=new FileOutputStream(userfile,true);
				
				User userbuffer=new User();
				userbuffer.setUserByString(pusername, password, prole);
				ostream.write(userbuffer.userlen);
				ostream.write(userbuffer.usernamelen);
				ostream.write(userbuffer.username);
				ostream.write(userbuffer.passwordlen);
				ostream.write(userbuffer.password);
				ostream.write(userbuffer.rolelen);
				ostream.write(userbuffer.role);

				ostream.flush();
				ostream.close();
				
				result=true;
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	
	public boolean DeleteUser(String puserlist,String prole){
		boolean result=false;
		String username[]=puserlist.split(",");
		int usercount=username.length;
		
		try {
			File userfile=new File(UserDataFile);
			if(userfile.exists()){
				//read all undelete user.
				FileInputStream istream=new FileInputStream(userfile);

				Long lfilelength=userfile.length();
				int filelength=lfilelength.intValue();
				
				byte filebuffer[]=new byte[filelength];
				int lfilebuffer=0;
								
				User userbuff=new User();
				byte outlength[]=new byte[1],outbuffer[];
				int offset=0;
				while(offset<filelength){
					if(istream.read(outlength,0,1)==1){
						int outlen=outlength[0];
						outbuffer=new byte[outlen];
						istream.read(outbuffer,0,outlen);
						userbuff.setUserByByte(outbuffer);
						
						boolean isdelete=false;
						if(userbuff.getRole().equals(prole)){
							String dstname=userbuff.getUsername();
							for(int j=0;j<usercount;j++){
								if(dstname.equals(username[j])){
									isdelete=true;
									break;
								}
							}
						}
						if(isdelete==false){
							filebuffer[lfilebuffer]=outlength[0];
							lfilebuffer+=1;
							for(int i=0;i<outlen;i++){
								filebuffer[lfilebuffer+i]=outbuffer[i];
							}
							lfilebuffer+=outlen;
						}

						offset+=outlen+1;
					}
					else break;
				}
				
				istream.close();

				//write all undelete user to file.
				FileOutputStream ostream=new FileOutputStream(userfile);
				ostream.write(filebuffer,0,lfilebuffer);
				ostream.flush();
				ostream.close();
				
				result=true;
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
	}


	public boolean UpdatePW(String prole,String pusername,String ppassword){
		boolean result=false;
		
		String password=MD5Operator.getMD5Digest(ppassword);
		if(password==null||password.isEmpty()) return result;
		
		try {
			File userfile=new File(UserDataFile);
			if(userfile.exists()){
				//read all undelete user.
				FileInputStream istream=new FileInputStream(userfile);

				Long lfilelength=userfile.length();
				int filelength=lfilelength.intValue();
				
				byte filebuffer[]=new byte[filelength];
				int lfilebuffer=0;
								
				User userbuff=new User();
				byte outlength[]=new byte[1],outbuffer[];
				int offset=0;
				while(offset<filelength){
					if(istream.read(outlength,0,1)==1){
						int outlen=outlength[0];
						outbuffer=new byte[outlen];
						istream.read(outbuffer,0,outlen);
						userbuff.setUserByByte(outbuffer);
						
						if(userbuff.getRole().equals(prole)&&userbuff.getUsername().equals(pusername)){
							userbuff.setUserByString(pusername, password, prole);
							
							filebuffer[lfilebuffer]=userbuff.userlen;
							lfilebuffer+=1;
							filebuffer[lfilebuffer]=userbuff.usernamelen;
							lfilebuffer+=1;
							for(int i=0;i<userbuff.usernamelen;i++){filebuffer[lfilebuffer+i]=userbuff.username[i];}
							lfilebuffer+=userbuff.usernamelen;
							filebuffer[lfilebuffer]=userbuff.passwordlen;
							lfilebuffer+=1;
							for(int i=0;i<userbuff.passwordlen;i++){filebuffer[lfilebuffer+i]=userbuff.password[i];}
							lfilebuffer+=userbuff.passwordlen;
							filebuffer[lfilebuffer]=userbuff.rolelen;
							lfilebuffer+=1;
							for(int i=0;i<userbuff.rolelen;i++){filebuffer[lfilebuffer+i]=userbuff.role[i];}
							lfilebuffer+=userbuff.rolelen;
						}
						else{
							filebuffer[lfilebuffer]=outlength[0];
							lfilebuffer+=1;
							for(int i=0;i<outlen;i++){
								filebuffer[lfilebuffer+i]=outbuffer[i];
							}
							lfilebuffer+=outlen;
						}

						offset+=outlen+1;
					}
					else break;
				}
				
				istream.close();

				//write all undelete user to file.
				FileOutputStream ostream=new FileOutputStream(userfile,false);
				ostream.write(filebuffer,0,lfilebuffer);
				ostream.flush();
				ostream.close();
				
				result=true;
				
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
	}
}
