package cn.logger;

import cn.config.SysConfig;
import cn.component.context.SpringContextKit;
import cn.constant.SqlConst;
import cn.pojo.entity.TSysLogLogin;
import cn.pojo.entity.TSysLogOp;
import cn.service.ILoggerDao;
import cn.constant.CommonConst;
import cn.util.core.LogKit;
import cn.util.http.IpKit;
import cn.util.core.ServletKit;
import cn.util.string.StringKit;
import cn.util.time.TimeKit;
import eu.bitwalker.useragentutils.UserAgent;
import java.util.TimerTask;

/**
 * 异步工厂（产生任务用）
 */
public class AsyncLoggingFactory
{
	/** 静态代码块获取静态注入变量值*/
	private final static boolean aspectLog = new SysConfig().isAspectLog();

    /**
     * 记录登陆信息 t_sys_logininfo
     *
     * @param username 用户名
     * @param status   状态
     * @param message  消息
     * @param args     列表
     * @return 任务task
     */
    public static TimerTask insertLoginInfo(final String username, final String status,
    		final String message,final Object... args) 
    {
        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletKit.getRequest().getHeader("User-Agent"));
        final String ip = IpKit.getIpAddr(ServletKit.getRequest());
        return new TimerTask() {
            @Override
            public void run() {
                String address = IpKit.getRealAddressByIP(ip);
                StringBuilder s = new StringBuilder();
                s.append(StringKit.getBlock(ip));
                s.append(address);
                s.append(StringKit.getBlock(username));
                s.append(StringKit.getBlock(status));
                s.append(StringKit.getBlock(message));
                // 打印信息到日志
                LogKit.info(s.toString(), args);

                if(!aspectLog){
                    return;
                }

                // 获取客户端操作系统
                String os = userAgent.getOperatingSystem().getName();
                // 获取客户端浏览器
                String browser = userAgent.getBrowser().getName();
                TSysLogLogin entity = new TSysLogLogin();
                entity.setUserName(username);
                entity.setIpaddr(ip);
                entity.setLoginLocation(address);
                entity.setBrowser(browser);
                entity.setOs(os);
                entity.setMsg(message);
                entity.setLoginTime(TimeKit.getNowLocalDateTime());
                // 日志状态
                if (CommonConst.LOGIN_SUCCESS.equals(status) || CommonConst.LOGOUT.equals(status)){
                    entity.setStatus(SqlConst.SUCCESS);
                } 
                else if (CommonConst.LOGIN_FAIL.equals(status)){
                    entity.setStatus(SqlConst.FAIL);
                }
                // 插入数据
                SpringContextKit.getBean(ILoggerDao.class).insertLogininfo(entity);
            }
        };
    }

    /**
     * 操作日志记录
     * 操作日志信息 t_sys_oper_log
     * 任务task
     */
    public static TimerTask insertOpInfo(TSysLogOp entity)
    {
    	if(!aspectLog){
    		return null;
    	}    	
        return new TimerTask() {
            @Override
            public void run() {
            	SpringContextKit.getBean(ILoggerDao.class).insertOpInfo(entity);
            }
        };
    }
}
