package com.espeed.action;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.espeed.centre.pojo.YxyUserInfo;
import com.espeed.log.LogClass;
import com.espeed.pojo.YxySendFilterAddress;
import com.espeed.service.YxySendFilterAddressService;
import com.espeed.tool.ConfigPath;
import com.espeed.tool.DomParseXml;
import com.espeed.vo.PageBean;
import com.opensymphony.xwork2.ActionContext;
/**
 * 程序名称:    	EspeedMail_时速邮箱
 * 程序版本:    	V1.0
 * 作    者:    	深圳市科飞时速网络技术有限公司(0755-88843776)
 * 版权所有:    	深圳市科飞时速网络技术有限公司
 * 技术支持:    	Tech@21gmail.com
 * 单元名称:     发送过滤地址action
 * 开始时间:    	2013.12.09
 * 程 序 员:    	谢勇
 * 最后修改:    
 * 备    注:		如需修改请通知程序员    
 */
public class YxyFilterAddressAction extends BaseAction{
	private static final long serialVersionUID = 1L;
	public static final String emailyz=ConfigPath.getEmailYZ();
	public static final String domainyz=ConfigPath.getDomainYZ();
	/**条件查询过滤地址*/
	public String findByCondition(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			pagebean.setCurrentPage(currpage);
			pagebean.setPageSize(pagesize);
			filteraddresslist=filteraddressservice.findByCondition(loginid,domain,condition,conditionvalue,pagebean);
		} catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return "list";
	}
	
	/**添加过滤地址(可多个)*/
	public String addFilterAddressPi(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			//返回值
			resultmap.put("success", 0);//成功量
			resultmap.put("nohefa", 0);//不合法量
			resultmap.put("chongfu", 0);//文件重复量
			resultmap.put("exits", 0);//已存在量
			//查询已存在的地址
			List<Object> exitsaddress=filteraddressservice.findIsExits(loginid,domain);
			//过滤地址集合
			List<YxySendFilterAddress> filteraddrlist=new ArrayList<YxySendFilterAddress>();
			//地址对象
			YxySendFilterAddress o=null;
			//当前日期
			SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:ss:mm");
			String nowdate=df.format(new Date());
			
			//以换行分割地址
			String [] filterArry=addressarray.split("\n");
			//去掉本身重复的
			Set<String> setlist=new HashSet<String>();
			for(int s=0;s<filterArry.length;s++){
				setlist.add(filterArry[s]);
			}
			int chongfu=filterArry.length-setlist.size();
			resultmap.put("chongfu",chongfu);//文件重复量
			Pattern p=null;
			Iterator<String> iterator =setlist.iterator();
			String addressValue="";
			our:while (iterator.hasNext()) {
				addressValue=(String)iterator.next();
				//判断地址的合法性
				//1.email地址判断
				 p = Pattern.compile(emailyz);
				 Matcher m = p.matcher(addressValue);
				 if(!m.matches()){
					//2.域名判断
					 p = Pattern.compile(domainyz);
					 Matcher m1 = p.matcher(addressValue);
					 if(!m1.matches()){
						 int nohefa=resultmap.get("nohefa")+1;
						 resultmap.put("nohefa",nohefa);//不合法量
						 continue our;
					 }
				 }
				 //是否重复判断
				 for(int j=0;j<exitsaddress.size();j++){
					 if(addressValue.equals(exitsaddress.get(j).toString())){
						 int nohefa=resultmap.get("exits")+1;
						 resultmap.put("exits",nohefa);//已存在量
						 continue our; 
					 }
				 }
				 //建立对象
				 o=new YxySendFilterAddress();
				 o.setFilteraddrdate(nowdate);
				 o.setFilteraddrdomain(domain);
				 o.setFilteraddress(addressValue);
				 o.setFilteraddrloginid(loginid);
				 o.setFilteraddrreason(filterbody);
				 o.setFilterid(filterid);

				 filteraddrlist.add(o);
            }
			//循环插入
			if(filteraddrlist.size()>0){
				filteraddressservice.addFilterAddressPi(filteraddrlist);
			}
			resultmap.put("success",filteraddrlist.size());//成功量
			resultmap.put("result",1);//结果
		} catch (Exception e) {
			resultmap.put("result",0);//结果
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return "add";
	}
	
	/**批量外部文件导入*/
	public String addFilterAddressFile(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			//返回值
			resultmap.put("result",0);//返回值
			resultmap.put("success",0);//成功量
			resultmap.put("tolnum",0);//文件总量
			resultmap.put("fcnum",0);//文件重复
			resultmap.put("scnum",0);//系统重复
			resultmap.put("nonum",0);//不合法量
			
			int filelinenum=0;//文件行数
			//地址对象
			YxySendFilterAddress o=null;
			
			//时间定义
			SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			String nowdate=df.format(new Date());
			
			//读取文件路径
			String addressFilePath=file.getPath();
			
			//判断文件格式是否正确
			int i = filename.lastIndexOf(".");
			String filetype =filename.substring(i + 1);
			//如是不是txt与xls类型文件则无法导入
			if(!"txt".equals(filetype)&&!"xls".equals(filetype)){
				resultmap.put("result",-1);//"您导入的文件类型不对,请重新选择";
				return "add";
			}
			//查询系统已存在的地址
			List<Object> exitsaddress=filteraddressservice.findIsExits(loginid,domain);
			//过滤地址集合
			List<YxySendFilterAddress> filteraddrlist=new ArrayList<YxySendFilterAddress>();
			//文件地址集合
			List<String> filelist=new ArrayList<String>();
			
			//判断导入的地址条数
			if("txt".equals(filetype)){
				filelinenum=DomParseXml.getTxtLineNum(addressFilePath);//txt文件条数
				if(filelinenum<=1){
					resultmap.put("result",-2);//您导入的文件无任何数据,请重新选择
					return "add";
				}
				resultmap.put("tolnum",filelinenum);//文件总量
				//解析文件
				String tmpLineVal;
				String encoding = "Unicode";
				InputStreamReader in = new InputStreamReader(new FileInputStream(addressFilePath), encoding);
				int p = (in.read() << 8) + in.read();
				switch (p) {    
	              case 0xefbb:    
	            	  encoding = "UTF-8";    
	                  break;    
	              case 0xfffe:    
	            	  encoding = "Unicode";    
	                  break;    
	              case 0xfeff:    
	            	  encoding = "UTF-16BE";    
	                  break;    
	              default:    
	            	  encoding = "GBK";    
				}
				InputStreamReader in1 = new InputStreamReader(new FileInputStream(addressFilePath), encoding);
				BufferedReader bufread1 = new BufferedReader(in1);
				String line_record ="";
				our:while((tmpLineVal = bufread1.readLine())!=null){
					// 解析每一条记录返回结果
					line_record = tmpLineVal;
					if(line_record!=null&&!line_record.equals("")){
						//去掉空格
						line_record=line_record.trim();
						//1.email地址判断
						Pattern yz = Pattern.compile(emailyz);
						Matcher m = yz.matcher(line_record);
						if(!m.matches()){//不是正确的
							//2.域名判断
							Pattern p1 = Pattern.compile(domainyz);
							Matcher m1 = p1.matcher(line_record);
							 if(!m1.matches()){
								int nonum=resultmap.get("nonum")+1;
								resultmap.put("nonum",nonum);//不合法量
								continue;
							 }
						}
						//判断文件本身是否重复
						for(int f=0;f<filelist.size();f++){
							if(line_record.equals(filelist.get(f))){
								int fcnum=resultmap.get("fcnum")+1;
								resultmap.put("fcnum",fcnum);//文件重复
								continue our;
							}
						}
				/**-----------------txt文件导入-修改之前---------------------------------------*/
						 //判断系统文件是否重复
						 for(int j=0;j<exitsaddress.size();j++){
							 if(line_record.equals(exitsaddress.get(j).toString())){
								 int scnum=resultmap.get("scnum")+1;
								 resultmap.put("scnum",scnum);//已存在量
								 continue our; 
							 }
						 }
				/**-----------------txt文件导入-修改之后---------------------------------------*/
						//加入地址结合
						filelist.add(line_record);
						//建立对象
						o=new YxySendFilterAddress();
						o.setFilteraddrdate(nowdate);
						o.setFilteraddrdomain(domain);
						o.setFilteraddress(line_record);
						o.setFilteraddrloginid(loginid);
						o.setFilteraddrreason(filterbody);
						o.setFilterid(filterid);

						//加入集合对象中
						filteraddrlist.add(o);
						
					}else{
						int nonum=resultmap.get("nonum")+1;
						resultmap.put("nonum",nonum);//不合法量
					}
				}
			}else if("xls".equals(filetype)){
				//把一张xls的数据表读到wb里
				HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(new File(addressFilePath)));
				//读取第一页
				HSSFSheet sheet = wb.getSheetAt(0);
				//获取一个表最后一条记录的记录号
				filelinenum=sheet.getLastRowNum() + 1;//xls文件条数
				if(filelinenum<=1){
					resultmap.put("result",-2);//您导入的文件无任何数据,请重新选择
					return "add";
				}
				resultmap.put("tolnum",filelinenum);//文件总量
				
				//循环每一行的数据
				for (int j = 1; j < sheet.getLastRowNum() + 1; j++) {
					//创建一个对象
					HSSFRow row = sheet.getRow(j);
					String mailAddrAndName="";
					if(row==null){
						int nonum=resultmap.get("nonum")+1;
						resultmap.put("nonum",nonum);//不合法量
					}else{
						//一行对应的每一列的数据
						our:for(int k = 0; k < row.getLastCellNum(); k++) {
							//获取每一行中一个单元格中的值
							HSSFCell cell = row.getCell((short) k);
				/**-----------------xls文件导入-修改之前---------------------------------------*/
							//判断单元格中是否为空
							if(cell != null){
								if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
						            // 返回布尔类型的值
									mailAddrAndName = String.valueOf(cell.getBooleanCellValue());			           
						        }else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
						        	//返回数值类型的值
						        	mailAddrAndName = "";
						        }else{
						        	//返回字符串类型的值
						        	mailAddrAndName = String.valueOf(cell.getStringCellValue());
						        }
								//去掉空格
								mailAddrAndName=mailAddrAndName.trim();
								if(mailAddrAndName != null && !mailAddrAndName.equals("")){
									//1.判断格式是否为邮件格式
									Pattern yz = Pattern.compile(emailyz);
									Matcher m = yz.matcher(mailAddrAndName);
									if(!m.matches()){
										//2.判断格式是否为域名格式
										Pattern p1 = Pattern.compile(domainyz);
										Matcher m1 = p1.matcher(mailAddrAndName);
										if(!m1.matches()){
											 int nonum=resultmap.get("nonum")+1;
											 resultmap.put("nonum",nonum);//不合法量
											 continue;
										}
									}
									//3.判断与文件本身信息是否重复
									for(int f=0;f<filelist.size();f++){
										if(mailAddrAndName.equals(filelist.get(f))){
											int fcnum=resultmap.get("fcnum")+1;
											resultmap.put("fcnum",fcnum);//文件重复
											continue our;
										}
									}
									//4.判断与系统存在信息是否重复
									 for(int e=0;e<exitsaddress.size();e++){
										 if(mailAddrAndName.equals(exitsaddress.get(e).toString())){
											 int scnum=resultmap.get("scnum")+1;
											 resultmap.put("scnum",scnum);//已存在量
											 continue our; 
										 }
									 }
									//加入地址结合
									filelist.add(mailAddrAndName);
									//建立对象
									o=new YxySendFilterAddress();
									o.setFilteraddrdate(nowdate);
									o.setFilteraddrdomain(domain);
									o.setFilteraddress(mailAddrAndName);
									o.setFilteraddrloginid(loginid);
									o.setFilteraddrreason(filterbody);
									o.setFilterid(filterid);

								//加入集合对象中
								filteraddrlist.add(o);
								}else{
									int nonum=resultmap.get("nonum")+1;
									resultmap.put("nonum",nonum);//不合法量
								}
						}else{
							int nonum=resultmap.get("nonum")+1;
							resultmap.put("nonum",nonum);//不合法量
						}
			/**-----------------xls文件导入-修改之后--------------------------------------*/
						
							
							
//							if(cell!=null){
//								if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
//						            // 返回布尔类型的值
//									mailAddrAndName += String.valueOf(cell.getBooleanCellValue()+",");			           
//						        }else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
//						        	//返回数值类型的值
//						        	mailAddrAndName +=""+",";
//						        }else{
//						        	//返回字符串类型的值
//						        	mailAddrAndName += String.valueOf(cell.getStringCellValue()+",");
//						        }
//								if(mailAddrAndName==null||mailAddrAndName.equals("")){
//									int nonum=resultmap.get("nonum")+1;
//									resultmap.put("nonum",nonum);//不合法量
//								}else{
//									String lastAddress=mailAddrAndName.replaceAll(" ", "");//最后地址
//									Pattern yz = Pattern.compile(emailyz);
//									Matcher m = yz.matcher(lastAddress);
//									if(!m.matches()){//不是正确的
//										Pattern p1 = Pattern.compile(domainyz);
//										Matcher m1 = p1.matcher(mailAddrAndName);
//										 if(!m1.matches()){
//											 int nonum=resultmap.get("nonum")+1;
//											 resultmap.put("nonum",nonum);//不合法量
//											 continue;
//										 }
//										//判断文件本身是否重复
//										for(int f=0;f<filelist.size();f++){
//											if(mailAddrAndName.equals(filelist.get(f))){
//												int fcnum=resultmap.get("fcnum")+1;
//												resultmap.put("fcnum",fcnum);//文件重复
//												continue our;
//											}
//										}
//										//加入地址结合
//										filelist.add(mailAddrAndName);
//										//建立对象
//										o=new YxySendFilterAddress();
//										o.setFilteraddrdate(nowdate);
//										o.setFilteraddrdomain(domain);
//										o.setFilteraddress(mailAddrAndName);
//										o.setFilteraddrloginid(loginid);
//										o.setFilteraddrreason(filterbody);
//										o.setFilterid(filterid);
//										
//										//加入集合对象中
//										filteraddrlist.add(o);
//									}else{
//										int nonum=resultmap.get("nonum")+1;
//										resultmap.put("nonum",nonum);//不合法量
//									}
//								}
//							}else{
//								int nonum=resultmap.get("nonum")+1;
//								resultmap.put("nonum",nonum);//不合法量
//							}
						}	
					}
				} 
			}
			
			//循环插入
			if(filteraddrlist.size()>0){
				filteraddressservice.addFilterAddressPi(filteraddrlist);
			}
			resultmap.put("success",filteraddrlist.size());//成功量
			resultmap.put("result",1);//结果
	    	return "add";
			
		} catch (Exception e) {
			resultmap.put("result",0);//结果
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return "addFilterAddress";
	}
	
	/**删除所选过滤地址*/
	public String delFilterAddress(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			filteraddressservice.delFilterAddress(addressstr);
			result=1;
		} catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return SUCCESS;
	}
	
	/**过滤地址是否存在*/
	public String findIsExits(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			result=filteraddressservice.findIsExits(loginid, domain, verifystr);
		} catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return SUCCESS;
	}
	
	/**编辑过滤地址*/
	public String updateFilterAddress(){
		try {
			//获取用户session
			ActionContext ac = ActionContext.getContext();
			Map<String,Object> sess = ac.getSession();			
			YxyUserInfo user=(YxyUserInfo) sess.get("yxyuser");
			loginid=user.getLogin_id();//用户账号
			domain=user.getDomain();//用户所属域名
			filteraddressservice.updateFilterAddress(filteraddress);
			result=1;
		} catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
	        String str = sw.toString();
	        LogClass.errolog(str,loginid+"@"+domain);
		}
		return SUCCESS;
	}
	
	private int condition;
	private int pagesize;
	private int currpage;
	private int filterid;//过滤分类ID
	private int result;
	private String conditionvalue;
	private String loginid="erro";
	private String domain="erro";
	private String addressarray;
	private String filename;
	private String addressstr;
	private String verifystr;
	private String filterbody;//过滤内容
	private File file;
	private PageBean pagebean;
	private YxySendFilterAddress filteraddress;
	private YxySendFilterAddressService filteraddressservice;
	private List<YxySendFilterAddress> filteraddresslist;
	private Map<String,Integer> resultmap=new HashMap<String, Integer>();
	public YxySendFilterAddressService getFilteraddressservice() {
		return filteraddressservice;
	}
	public void setFilteraddressservice(
			YxySendFilterAddressService filteraddressservice) {
		this.filteraddressservice = filteraddressservice;
	}
	public List<YxySendFilterAddress> getFilteraddresslist() {
		return filteraddresslist;
	}
	public void setFilteraddresslist(List<YxySendFilterAddress> filteraddresslist) {
		this.filteraddresslist = filteraddresslist;
	}
	public int getCondition() {
		return condition;
	}
	public void setCondition(int condition) {
		this.condition = condition;
	}
	public String getConditionvalue() {
		return conditionvalue;
	}
	public void setConditionvalue(String conditionvalue) {
		this.conditionvalue = conditionvalue;
	}
	public int getPagesize() {
		return pagesize;
	}
	public void setPagesize(int pagesize) {
		this.pagesize = pagesize;
	}
	public int getCurrpage() {
		return currpage;
	}
	public void setCurrpage(int currpage) {
		this.currpage = currpage;
	}
	public PageBean getPagebean() {
		return pagebean;
	}
	public void setPagebean(PageBean pagebean) {
		this.pagebean = pagebean;
	}
	public int getResult() {
		return result;
	}
	public void setResult(int result) {
		this.result = result;
	}
	public YxySendFilterAddress getFilteraddress() {
		return filteraddress;
	}
	public void setFilteraddress(YxySendFilterAddress filteraddress) {
		this.filteraddress = filteraddress;
	}
	public String getLoginid() {
		return loginid;
	}
	public void setLoginid(String loginid) {
		this.loginid = loginid;
	}
	public String getDomain() {
		return domain;
	}
	public void setDomain(String domain) {
		this.domain = domain;
	}
	public String getAddressarray() {
		return addressarray;
	}
	public void setAddressarray(String addressarray) {
		this.addressarray = addressarray;
	}
	public Map<String, Integer> getResultmap() {
		return resultmap;
	}
	public void setResultmap(Map<String, Integer> resultmap) {
		this.resultmap = resultmap;
	}
	public String getFilterbody() {
		return filterbody;
	}
	public void setFilterbody(String filterbody) {
		this.filterbody = filterbody;
	}
	public int getFilterid() {
		return filterid;
	}
	public void setFilterid(int filterid) {
		this.filterid = filterid;
	}
	public File getFile() {
		return file;
	}
	public void setFile(File file) {
		this.file = file;
	}
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public String getAddressstr() {
		return addressstr;
	}
	public void setAddressstr(String addressstr) {
		this.addressstr = addressstr;
	}
	public String getVerifystr() {
		return verifystr;
	}
	public void setVerifystr(String verifystr) {
		this.verifystr = verifystr;
	}
}