package org.zhios.website.admin.model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class ConfFileOpt {
	private String fp;
	
	public ConfFileOpt(String filepath){
		fp=filepath;
	}
	
	public String getNodeValue(String nodeid){
		if(nodeid==null) return null;
		
		String value=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			Element elem=doc.getElementById(nodeid);
			if(elem!=null)
				value=elem.getTextContent();
			else
				value="";
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return value;
	}
	
	public String[] getNodesValue(String[] nodeid){
		if(nodeid==null) return null;
		
		String[] value=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			
			int propertycount=nodeid.length;
			value=new String[propertycount];
			for(int i=0;i<propertycount;i++){
				Element elem=doc.getElementById(nodeid[i]);
				if(elem!=null)
					value[i]=elem.getTextContent();
				else
					value[i]="";
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return value;
	}

	public String[] getNodesId(String tagname){
		String[] nodeid=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			
			NodeList nodelist=doc.getElementsByTagName(tagname);
			int nodecount=nodelist.getLength();
			nodeid=new String[nodecount];
			for(int i=0;i<nodecount;i++){
				nodeid[i]=nodelist.item(i).getAttributes().getNamedItem("id").getNodeValue();
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return nodeid;
	}
	
	public String[] getNodesName(String[] nodeid){
		if(nodeid==null) return null;
		
		String[] value=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			
			int propertycount=nodeid.length;
			value=new String[propertycount];
			for(int i=0;i<propertycount;i++){
				Element elem=doc.getElementById(nodeid[i]);
				if(elem!=null)
					value[i]=elem.getAttribute("name");
				else
					value[i]="";
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return value;
	}

	public String[][] getNodesIdName(String tagname){
		String[][] nodeidname=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			
			NodeList nodelist=doc.getElementsByTagName(tagname);
			int nodecount=nodelist.getLength();
			nodeidname=new String[nodecount][2];
			for(int i=0;i<nodecount;i++){
				Element elem=(Element)nodelist.item(i);
				nodeidname[i][0]=elem.getAttribute("id");
				nodeidname[i][1]=elem.getAttribute("name");
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return nodeidname;
	}

	public String [] getChildNodesName(String nodeid){
		if(nodeid==null) return null;
		
		String[] value=null;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);

			NodeList childnodes=doc.getElementById(nodeid).getElementsByTagName("page");
			
			int count=childnodes.getLength();
			value=new String[count];
			
			for(int i=0;i<count;i++){
				value[i]=childnodes.item(i).getAttributes().getNamedItem("name").getNodeValue();
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return value;
	}

	public boolean addNode(String parentid, String tagname, String nodeid, String name){
		if((parentid==null)||(tagname==null)||(nodeid==null)||(name==null)) return false;
		
		boolean writesucceed=false;
		try{			
			File file=new File(fp);
			if(file.exists()){
				//Get file content
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
				BufferedReader buffreader=new BufferedReader(ireader);
				String tempstr="",filestring="";
			    while((tempstr=buffreader.readLine())!=null){filestring+=tempstr+"\r\n";}
			    buffreader.close();
			    ireader.close();

			    String writestring="";
			    int tempint=0;
			    //Get Header and Tail
			    if(!filestring.isEmpty()){
			    	String idstr="id=\""+parentid+"\"";
			    	tempint=filestring.lastIndexOf("<",filestring.indexOf(idstr))+1;
			    	String parenttag=filestring.substring(tempint,filestring.indexOf(" ",tempint));
			    	int tailstart=filestring.indexOf("</"+parenttag+">",tempint);
			    	tailstart=filestring.lastIndexOf("\r\n",tailstart);
					writestring=filestring.substring(0,tailstart);
					writestring+="\r\n\t<"+tagname+" id=\""+nodeid+"\" name=\""+name+"\">\r\n\t</"+tagname+">";
					writestring+=filestring.substring(tailstart);
			    }
			    
			    //Write into file.
			    if(!writestring.isEmpty()){
				    OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); 
				    BufferedWriter buffwriter=new BufferedWriter(owriter);
				    buffwriter.write(writestring);
				    buffwriter.flush();
				    
				    buffwriter.close();
				    owriter.close();
			    }
			    
				writesucceed=true;
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return writesucceed;
	}


	public boolean updateNodeName(String nodeid, String name){
		if((nodeid==null)||(name==null)) return false;
		
		boolean writesucceed=false;
		try{			
			File file=new File(fp);
			if(file.exists()){
				//Get file content
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
				BufferedReader buffreader=new BufferedReader(ireader);
				String tempstr="",filestring="";
			    while((tempstr=buffreader.readLine())!=null){filestring+=tempstr+"\r\n";}
			    buffreader.close();
			    ireader.close();

			    String writestring="";
			    if(!filestring.isEmpty()){
			    	String idstr="id=\""+nodeid+"\"";
			    	int startint=filestring.lastIndexOf("<",filestring.indexOf(idstr))+1;
			    	int endint=filestring.indexOf(">",startint);
			    	tempstr=filestring.substring(startint,endint);
			    	int namestart=tempstr.indexOf("name=\"");
		    		namestart+=6;
		    		int nameend=tempstr.indexOf("\"",namestart+1);
		    		
					writestring=filestring.substring(0,startint+namestart);
					writestring+=name;
					writestring+=filestring.substring(startint+nameend);
			    }
			    
			    //Write into file.
			    if(!writestring.isEmpty()){
				    OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); 
				    BufferedWriter buffwriter=new BufferedWriter(owriter);
				    buffwriter.write(writestring);
				    buffwriter.flush();
				    
				    buffwriter.close();
				    owriter.close();
			    }
			    
				writesucceed=true;
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return writesucceed;
	}

	public boolean deleteNodeById(String nodeid){
		if((nodeid==null)) return false;
		
		boolean writesucceed=false;
		try{			
			File file=new File(fp);
			if(file.exists()){
				//Get file content
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
				BufferedReader buffreader=new BufferedReader(ireader);
				String tempstr="",writestring="";
			    while((tempstr=buffreader.readLine())!=null){writestring+=tempstr+"\r\n";}
			    buffreader.close();
			    ireader.close();
			    
			    //find begin and end of dsttag.
			    int beginint=writestring.indexOf("id=\""+nodeid+"\"");
			    beginint=writestring.lastIndexOf("<",beginint);
				String tagname=writestring.substring(beginint+1,writestring.indexOf(" ",beginint));
			    
			    beginint=writestring.lastIndexOf("\r\n",beginint);
			    int endint=writestring.indexOf("</"+tagname+">",beginint)+tagname.length()+3;

			    if(beginint>=0&&endint>=0){
				    //Write into file.
				    if(!writestring.isEmpty()){
					    OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); 
					    BufferedWriter buffwriter=new BufferedWriter(owriter);
					    buffwriter.write(writestring.substring(0,beginint));
					    buffwriter.write(writestring.substring(endint));
					    buffwriter.flush();
					    
					    buffwriter.close();
					    owriter.close();
				    }
				    
					writesucceed=true;
			    }
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return writesucceed;
	}

	public boolean deleteNodeByName(String nodename){
		if((nodename==null)) return false;
		
		boolean writesucceed=false;
		try{			
			File file=new File(fp);
			if(file.exists()){
				//Get file content
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
				BufferedReader buffreader=new BufferedReader(ireader);
				String tempstr="",writestring="";
			    while((tempstr=buffreader.readLine())!=null){
			    	writestring+=tempstr+"\r\n";
			    }
			    buffreader.close();
			    ireader.close();
			    
			    tempstr=writestring;
			    writestring="";
			    String namestr="name=\""+nodename+"\"";
			    int beginint=-1;
			    while((beginint=tempstr.indexOf(namestr))>=0){
			    	
				    beginint=tempstr.lastIndexOf("<",beginint);
					String tagname=tempstr.substring(beginint+1,tempstr.indexOf(" ",beginint));
				    
				    beginint=tempstr.lastIndexOf("\r\n",beginint);
				    int endint=tempstr.indexOf("</"+tagname+">",beginint)+tagname.length()+3;
	
				    if(beginint>=0&&endint>=0){
				    	writestring+=tempstr.substring(0,beginint);
				    	tempstr=tempstr.substring(endint);
				    }
			    }
			    writestring+=tempstr;
				
			    //Write into file.
			    if(!writestring.isEmpty()){
				    OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8"); 
				    BufferedWriter buffwriter=new BufferedWriter(owriter);
				    buffwriter.write(writestring);
				    buffwriter.flush();
				    
				    buffwriter.close();
				    owriter.close();
			    }
			    
				writesucceed=true;
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return writesucceed;
	}

	public boolean isNodeExist(String nodeid){
		if(nodeid==null) return false;
		
		boolean result=false;
		try{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
			DocumentBuilder builder = factory.newDocumentBuilder(); 
			Document doc = builder.parse(fp);
			Element elem=doc.getElementById(nodeid);
			if(elem!=null) result=true;
		}
		catch(Exception e){
			e.printStackTrace();
		}

		return result;
	}
	
}
