package com.jeecms.common;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.jeecms.auth.domain.CoreUser;
import com.jeecms.common.constants.WebConstants;
import com.jeecms.common.jsonfilter.advice.JsonFilterResponseBodyAdvice;
import com.jeecms.common.jsonfilter.bean.JsonFilterObject;
import com.jeecms.common.response.ResponseInfo;
import com.jeecms.common.util.LoggerUtils;
import com.jeecms.common.util.UserAgentUtils;
import com.jeecms.common.web.util.RequestUtils;
import com.jeecms.system.domain.CmsSite;
import com.jeecms.system.domain.SysLog;
import com.jeecms.system.service.SysLogService;
import com.jeecms.util.SystemContextUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletRequest;

/**
 * 自定义ResponseBodyAdvice实现日志拦截记录类,执行顺序在{@link JsonFilterResponseBodyAdvice}}之后
 *
 * @Description:
 * @author: wangqq
 * @date: 2018年3月19日 下午3:00:37
 * @Copyright: 江西金磊科技发展有限公司 All rights reserved. Notice
 * 仅限于授权后使用,禁止非授权传阅以及私自用于商业目的。
 */
@SuppressWarnings("rawtypes")
@Order(2)
@ControllerAdvice
public class LogResponseBodyAdvice implements ResponseBodyAdvice {
	static Logger logger = LoggerFactory.getLogger(LogResponseBodyAdvice.class);

	@Override
	public boolean supports(MethodParameter methodParameter, Class aClass) {
		return true;
	}

	@Override
	public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass,
								  ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
		HttpServletRequest request = RequestUtils.getHttpServletRequest();
		String urlPath = RequestUtils.getRequestUrl(request);
		//当前请求路径非后台路径不进行日志记录
		if (StringUtils.isNotBlank(urlPath) && RequestUtils.isAdminRequest()) {
			if (o != null && o instanceof JsonFilterObject) {
				ResponseInfo info;
				Object obj = ((JsonFilterObject) o).getJsonObject();
				if (obj != null && obj instanceof ResponseInfo) {
					info = (ResponseInfo) obj;
					//调用线程池中的线程进行异步处理
					SysLog log = new SysLog();
					// 设置客户端ip
					log.setClientIp(LoggerUtils.getCliectIp(request));
					// 设置请求方法
					log.setMethod(request.getMethod());
					// 设置请求参数内容json字符串
					String paramData = JSON.toJSONString(request.getParameterMap(),
						SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue);
					log.setParamData(paramData);
					// 设置sessionId
					String sessionId = request.getRequestedSessionId();
					log.setSessionId(sessionId);
					// 请求耗时
					Object sendTime = request.getAttribute(WebConstants.LOGGER_SEND_TIME);
					if (sendTime != null) {
						long time = Long.parseLong(sendTime.toString());
						long currentTime = System.currentTimeMillis();
						log.setTimeConsuming(Integer.valueOf((currentTime - time) + ""));
						//接口返回时间
						log.setReturmTime(currentTime + "");
					}
					//浏览器
					log.setBrowser(UserAgentUtils.getBrowserInfo(request));
					//操作系统
					log.setOs(UserAgentUtils.getClientOS(request));
					//用户代理
					log.setUserAgent(UserAgentUtils.getBrowerUserAgent(request));
					// 设置请求地址
					log.setUri(urlPath);
					String methods = request.getMethod();
					CoreUser user = SystemContextUtils.getCoreUser();
					CmsSite site = SystemContextUtils.getSite(request);
					sysLogService.asyncLog(methods, log, info, user, site);
				}
			}
		}
		return o;
	}


	@Autowired
	private SysLogService sysLogService;
}