package org.zhios.website.admin.model;

import java.awt.List;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.lang.reflect.Constructor;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.zhios.website.admin.pagelet.PageLetObj;


public class NewsManager {
	
	public String ReadNewsList(String packagename){
		String folderpath=SysConfig.RootPath+"/package/"+packagename;
		
		String newslist="";
		List filelist=readChildList(folderpath);
		
		String tempfilename="";
		String temptitle="";
		
		newslist="<table width='100%' border='1px' bordercolor='#000000'><tr style='background-color:#acacac'>" +
				"<td width='5%' align='center'><input type='checkbox' name='selall' onclick='javascript:SelDeselall(this.checked)'></td>" +
				"<td width='10%' align='center'><b>编号</b></td><td width='65%' align='center'><b>标题</b></td><td width='20%' align='center'><b>文件</b></td></tr>";
		
		for(int i=0;i<filelist.getItemCount();i++){
			tempfilename=filelist.getItem(i);
			temptitle=ReadTitle(folderpath+"/"+tempfilename);
			newslist+="<tr><td align='center'><input type='checkbox' name='news' value='"+tempfilename+"'></td><td align='center'>"+(i+1)+"</td>" +
					"<td><a href='"+SysConfig.RootUrl+"/package/"+packagename+"/"+tempfilename+"' target='_blank'>"+temptitle+"</a></td>" +
					"<td>"+tempfilename+"</td></tr>";
		}
		
		newslist+="</table>";
		
		return newslist;
	}
	
	//Get files and folders in special path.
	//Path: the path.
	//return: files and folders list.
	public List readChildList(String Path){
		List filelist=new List();
		
		File myPath = new File(Path);
		if(myPath.isDirectory()){ 
			File[] tempList = myPath.listFiles();
			for (int i = 0; i < tempList.length; i++) {
				if (tempList[i].exists()) {
					filelist.add(tempList[i].getName());
				}
			}
		}
		
		return filelist;
	}
	
	//Read Page's Content
	public String ReadTitle(String filepath){
		if(filepath==null) return null;

	    String titlestr="";
		try {
			File file=new File(filepath);
			if(file.exists()){
			    InputStreamReader ireader = new InputStreamReader(new FileInputStream(file),"UTF-8"); 
			    BufferedReader buffreader=new BufferedReader(ireader);
			    
			    int tempstart=0,tempend=0;
			    while((titlestr=buffreader.readLine())!=null){if((tempstart=titlestr.indexOf("<title>"))>=0) break;}
			    
			    if(!titlestr.isEmpty()){
				    tempstart+=7;
				    tempend=titlestr.indexOf("</title>");
				    if(tempend>=0) titlestr=titlestr.substring(tempstart,tempend);
				    else titlestr=titlestr.substring(tempstart);
			    }
			    
			    buffreader.close();
			    ireader.close();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
		return titlestr;
	}
	
	public class NameFileFilter implements FileFilter{
		private String namekey;
		
		public NameFileFilter(String key){
			namekey=key;
		}
		
		public boolean accept(File file){
			if(file.isDirectory()) return false;
			
			String name=file.getName();
			if(name.indexOf(namekey)>=0) return true;
			else return false;
		}
	};

	//add a news into a package
	//packagename: folder name of package
	//newsmodel:news model file been used.
	//newtitle:title of news
	//forminner:content of form in news.
	//return: new news list.
	public String AddNews(String packagepath, String newtitle, String forminner){
		String destfolderpath=SysConfig.RootPath+"/package/"+packagepath;
		
		//Get today's date.
		String nowdate=GetNowDate();

		//Get new file path(include new name).
		File myPath = new File(destfolderpath);
		File[] filelist = myPath.listFiles(new NameFileFilter(nowdate));
		String filename,tempstr;
		int tempint,newnum=0;
		for(int i=0;i<filelist.length;i++){
			filename=filelist[i].getName();
			tempstr=filename.substring(filename.indexOf(nowdate)+nowdate.length(),filename.lastIndexOf("."));
			tempint=Integer.parseInt(tempstr);
			if(tempint>newnum) newnum=tempint;
		}
		if(newnum>=99) return ReadNewsList(packagepath);
		newnum++;
		
		String destfilename;
		if(newnum<10) destfilename=nowdate+"0"+newnum+".html";
		else destfilename=nowdate+newnum+".html";

		AddNewFile(packagepath, destfilename, newtitle, forminner);
		
		return ReadNewsList(packagepath);
	}
	
	//Edit a news of a package
	//packagename: folder name of package
	//newsmodel:news model file been used.
	//newtitle:title of news
	//forminner:content of form in news.
	//return: new news list.
	public String EditNews(String packagepath, String destfilename, String newtitle, String forminner){
		String destfilepath=SysConfig.RootPath+"/package/"+packagepath+"/"+destfilename;

		try {
			File destfile=new File(destfilepath);
			
			if(destfile.exists()){
				if(destfile.delete())
					AddNewFile(packagepath, destfilename, newtitle, forminner);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
		return ReadNewsList(packagepath);
	}
	
	//add a news into a package
	//packagename: folder name of package
	//destfilename: destiny file name.
	//newsmodel:news model file been used.
	//newtitle:title of news
	//forminner:content of form in news.
	//return: new news list.
	public void AddNewFile(String packagename, String destfilename, String newtitle, String forminner){
		String tempstr="";
		
		//Get destiny file path.
		String destfilepath=SysConfig.RootPath+"/package/"+packagename+"/"+destfilename;

		//Get model file path.
		String modelfilepath=SysConfig.SettingPath+"/model/"+SysConfig.NewsModel;
		

	    //Read from model file, write to new file. Replace "input" object.
		try {
			File destfile=new File(destfilepath);
			
			if(!destfile.exists()){
				File modelfile=new File(modelfilepath);
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(modelfile),"UTF-8"); 
			 	BufferedReader buffreader=new BufferedReader(ireader);
			    
				String tempfilestr="";
				while((tempstr=buffreader.readLine())!=null){
					tempfilestr+=tempstr+"\r\n";
				}
				
				//Get title position.
				int begintitle=tempfilestr.indexOf("<title");
				if(begintitle<0) begintitle=tempfilestr.indexOf("<TITLE");
				
				int endtitle=-1;
				if(begintitle>=0){
					begintitle=tempfilestr.indexOf(">", begintitle)+1;
					endtitle=tempfilestr.indexOf("</title>", begintitle);
					if(endtitle<0) endtitle=tempfilestr.indexOf("</TITLE>", begintitle);
				}

				//Get form position.
				int beginform=tempfilestr.indexOf("<form");
				if(beginform<0) beginform=tempfilestr.indexOf("<FORM");
				
				int endform=-1;
				if(beginform>=0){
					beginform=tempfilestr.indexOf(">",beginform)+1;
					endform=tempfilestr.indexOf("</form>", beginform);
					if(endform<0) endform=tempfilestr.indexOf("</FORM>", beginform);
				}
				
				
				if((begintitle>=0)&&(endtitle>=0)&&(beginform>=0)&&(endform>=0)){
					destfile.createNewFile();
					
					OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(destfile),"UTF-8");
					BufferedWriter buffwriter=new BufferedWriter(owriter); 
					
					buffwriter.write(tempfilestr.substring(0,begintitle));
					buffwriter.write(newtitle);
					buffwriter.write(tempfilestr.substring(endtitle,beginform));
					buffwriter.write(forminner);
					buffwriter.write(tempfilestr.substring(endform));
					
				    buffwriter.flush();
				    
				    buffwriter.close();
				    owriter.close();
				}
				
			    buffreader.close();
			    ireader.close();
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	

	//delete a news from a package
	//packagename: folder name of package
	//filelist: the string of file for deleting, each file name is separated by "/".
	//return: new news list.
	public String DeleteFiles(String packagename, String filelist){
		
		String[] flist = filelist.split("/");
		
		for(int i=0;i<flist.length;i++){
			String destfilepath=SysConfig.RootPath+"/package/"+packagename+"/"+flist[i];
			File destfile = new File(destfilepath);
			
			if(destfile.exists()){
				destfile.delete();
			}
		}
		
		return ReadNewsList(packagename);
	}

	//edit a news of a package
	//packagename: folder name of package
	//filename: file name of news.
	//return: newsform innerHTML.
	public String GetNewsForm(String packagename, String filename){
		String destfilepath=SysConfig.RootPath+"/package/"+packagename+"/"+filename;
		
		String formstr="";
		try {		
			File destfile=new File(destfilepath);
			
			if(destfile.exists()){
				InputStreamReader ireader = new InputStreamReader(new FileInputStream(destfile),"UTF-8"); 
			 	BufferedReader buffreader=new BufferedReader(ireader);
			    
				String tempstr;
				int beginint=-1,endint=-1;
				while((tempstr=buffreader.readLine())!=null){
					if(beginint<0){
						beginint=tempstr.indexOf("<form");
						if(beginint<0) beginint=tempstr.indexOf("<FORM");
						if(beginint>=0){
							endint=tempstr.indexOf("</form>");
							if(endint<0) endint=tempstr.indexOf("</FORM>");
							if(endint>=0){
								formstr+=tempstr.substring(beginint,endint);
								break;
							}
							else{formstr+=tempstr.substring(beginint);}
						}
					}
					else{
						endint=tempstr.indexOf("</form>");
						if(endint<0) endint=tempstr.indexOf("</FORM>");
						if(endint>=0){
							formstr+=tempstr.substring(0,endint);
							break;
						}
						else{formstr+=tempstr;}
					}
				}
				
				if(!formstr.isEmpty())
					formstr=formstr.substring(formstr.indexOf(">")+1);
				
			    buffreader.close();
			    ireader.close();
			}
			else return "";
		}
		catch (Exception e) {
			e.printStackTrace();
			return "";
		}
		
		return formstr;
	}

	public String GetNowDate(){
		Calendar cal=Calendar.getInstance(); 
		long date=cal.getTime().getTime();
		SimpleDateFormat lFormat=new SimpleDateFormat("yyyyMMdd");
        String result=lFormat.format(date);
        
        return result;
	}

	//Update each file contented news list of a package
	//packagename: folder name of package
	public boolean UpdatePages(String packagename){
		boolean result=false;
		
		String conffilepath=SysConfig.RootPath+"package/package.xml";
		
		ConfFileOpt conffile=new ConfFileOpt(conffilepath);
		
		String pagepath[]=conffile.getChildNodesName(packagename);

		try {		
			for(int i=0;i<pagepath.length;i++){
				String dstfilepath=SysConfig.RootPath+pagepath[i];
				File dstfile=new File(dstfilepath);
				if(dstfile.exists()){
					boolean ischanged=false;	//to record if filestr is changed.
					
					InputStreamReader ireader = new InputStreamReader(new FileInputStream(dstfile),"UTF-8"); 
				 	BufferedReader buffreader=new BufferedReader(ireader);
				 	
				 	//Get file content string.
					String filestr="",tempstr;
					while((tempstr=buffreader.readLine())!=null)
						filestr+=tempstr+"\r\n";

					buffreader.close();
				    ireader.close();

					int beginint=-1,endint=0;
					while((beginint=filestr.indexOf("tmpackage:",endint))>=0){
						beginint+="tmpackage:".length();
						tempstr=filestr.substring(beginint,filestr.indexOf(">",beginint));
						endint=tempstr.indexOf(";");
						if(endint<0) endint=tempstr.indexOf("\"");
						if(endint<0) endint=tempstr.indexOf("'");
						if(endint<0) endint=tempstr.indexOf(" ");
						
						String temppackage;
						if(endint>=0) temppackage=tempstr.substring(0,endint).trim();
						else break;

						if(!temppackage.equals(packagename)){endint=beginint;}
						else
						{		
							//get begin and end of tmpackage div, to get outerHTML of tmpackage div.
							beginint=filestr.lastIndexOf("<",beginint);
							String temptag=filestr.substring(beginint+1,filestr.indexOf(" ",beginint));
							String temptagbegin="<"+temptag;
							String temptagend="</"+temptag+">";
									
							int temp1,temp2;
							temp1=beginint+temptagbegin.length();
							int tagcount=1;
							while(tagcount>0){
								temp2=filestr.indexOf(temptagend,temp1);
								tagcount--;
								tempstr=filestr.substring(temp1,temp2);
								while((temp1=tempstr.indexOf(temptagbegin))>=0){
									tempstr=tempstr.substring(temp1+temptagbegin.length());
									tagcount++;
								}
								temp1=temp2+temptagend.length();
							}
							endint=temp1;

							String outerHTML=filestr.substring(beginint,endint);

							//get id and tmstyle of tmpackage div.
							String divid=HtmlOpt.readFirstTagAttrValue(outerHTML, "div", "id");
							String tmstyle=HtmlOpt.readFirstTagAttrValue(outerHTML, "div", "tmstyle");

							//refresh html of component to page
							if((!outerHTML.isEmpty())&&(!divid.isEmpty())&&(!tmstyle.isEmpty())){
								//create pagelet.
								ConfFileOpt plconfig=new ConfFileOpt(SysConfig.ConfigPath+SysConfig.Language+"/pagelet.xml");
								String plstyle=plconfig.getNodeValue(tmstyle);
								if(!plstyle.isEmpty()){
									Class<?> tempclass = Class.forName(plstyle);
									Constructor<?> co = tempclass.getConstructor(String.class);
									PageLetObj pagelet=(PageLetObj)co.newInstance(divid);
									
									outerHTML=pagelet.resetViewStr(outerHTML);
									if(!outerHTML.isEmpty()){
										filestr=filestr.substring(0,beginint)+outerHTML+filestr.substring(endint);
										endint=beginint+outerHTML.length();
										ischanged=true;
									}
								}
							}
						}
					}
					
					//Write file string to file.
					if(ischanged==true){
						OutputStreamWriter owriter = new OutputStreamWriter(new FileOutputStream(dstfilepath),"UTF-8");
						BufferedWriter buffwriter=new BufferedWriter(owriter); 
						
						buffwriter.write(filestr);
					    buffwriter.flush();
					    
					    buffwriter.close();
					    owriter.close();
					}
				    
				    result=true;
				}
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
}
