package com.yunstudio.struts.interceptor;

import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.springframework.util.StringUtils;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.yunstudio.entity.RepAdmin;
import com.yunstudio.entity.RepLog;
import com.yunstudio.entity.RepPermission;
import com.yunstudio.service.AdminService;
import com.yunstudio.service.LogService;
import com.yunstudio.service.PermissionService;

public class LogInterceptor implements Interceptor{

	@Resource(name="logService")
	private LogService logService;
	
	@Resource(name="permissionService") 
	private PermissionService permissionService;

	public static List<RepPermission> list;
	
	public void destroy() {
		// TODO Auto-generated method stub
		list=null;
	}
	
	public void init() {
		if(list==null){
			list=permissionService.loadAll();
		}
	}

	@SuppressWarnings("unchecked")
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext actionContext=invocation.getInvocationContext();
		HttpServletRequest request=(HttpServletRequest) actionContext.get(ServletActionContext.HTTP_REQUEST);
		String actionName=actionContext.getName();
		
		String description=null;
		String type=null;
		
		//取出并遍历所有的permission对象,如果有含有actionName一样的则把对应的操作保存到description
		for (RepPermission permission : list) {
			if(permission.getActionname().equals(actionName)){
				description=permission.getName();
			}
		}
		//根据actionName里面包含的关键字判断操作的类型
		String actionNameLowerCase=actionName.toLowerCase();
		if(actionNameLowerCase.contains("add")){
			type="新增";
		}else if (actionNameLowerCase.contains("delete")) {
			type="删除";
		}else if (actionNameLowerCase.contains("update")
					||actionNameLowerCase.contains("lock")
					||actionNameLowerCase.contains("pass")
					||actionNameLowerCase.contains("modify")) {
			type="修改";
		}else if(actionNameLowerCase.contains("login")){
			type="登录";
			description="登录后台";
		}else if (actionNameLowerCase.contains("logout")) {
			type="登出";
			description="登出后台";
		}
		
		//创建RepLog对象来报错日志信息
		RepLog log=new RepLog();
		log.setOperationtime(new Date());
		log.setOperationip(request.getRemoteAddr());
		
		//执行action并获取执行完成的结果
		String result=invocation.invoke();
		
		String resultLowerCase=null;
		if(result!=null){
			resultLowerCase=result.toLowerCase();
		}
		//根据resultCode判断是否执行成功,不成功的话则什么也 不做
		if(resultLowerCase==null
				||resultLowerCase.equals("faild")
				||resultLowerCase.equals("add")
				||resultLowerCase.equals("edit")
				||resultLowerCase.equals("modify")
				||resultLowerCase.equals("login")
				){
			
		/*
		 * 成功的话根据
		 * description是否为空(即是否是有对应permission的action)
		 * type是否为空(既是否是含有增删改登陆登出的关键字)判断访问的action是否有必要记录。
		 */
		}else if(description!=null&&type!=null){
			RepAdmin admin=(RepAdmin) actionContext.getSession().get(RepAdmin.ADMIN);
			log.setRepAdmin(admin);
			log.setDescription(description);
			log.setOperationtype(type);
			log.setOperator(admin.getUsername());
			logService.add(log);
			
			Integer id=log.getId();
			List<Integer> ids=logService.findByhql(
					"select l.id from RepLog l where l.id<?", 0, id-800000);
			logService.deleteAll(ids);
			
		}
		
//		logService.remove();
		
		
		return result;
			
	}

}