package com.starry.admin.manager.factory;

import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.starry.admin.modules.system.module.entity.SysLoginLogEntity;
import com.starry.admin.modules.system.service.ISysLoginLogService;
import com.starry.common.constant.Constants;
import com.starry.common.utils.ServletUtils;
import com.starry.common.utils.SpringUtils;
import com.starry.common.utils.ip.AddressUtils;
import java.util.Date;
import java.util.TimerTask;
import lombok.extern.slf4j.Slf4j;

/**
 * @author admin
 */
@Slf4j
public class AsyncFactory {

    /**
     * 记录登录信息
     *
     * @param username
     *            用户名
     * @param status
     *            状态
     * @param message
     *            消息
     * @param args
     *            列表
     * @return 任务task
     */
    public static TimerTask recordLoginLog(final String username, final String status, final String message,
            final Object... args) {
        // 客户端操作系统、浏览器等信息
        final UserAgent userAgent = UserAgentUtil.parse(ServletUtils.getRequest().getHeader("User-Agent"));
        // 请求的IP地址
        final String ip = ServletUtil.getClientIP(ServletUtils.getRequest());
        return new TimerTask() {
            @Override
            public void run() {
                String address = AddressUtils.getRealAddressByIp(ip);
                // 获取客户端操作系统
                String os = userAgent.getOs().getName();
                // 获取客户端浏览器
                String browser = userAgent.getBrowser().getName();
                // 封装对象
                SysLoginLogEntity loginLog = new SysLoginLogEntity();
                loginLog.setUserCode(username);
                loginLog.setIpaddr(ip);
                loginLog.setLoginLocation(address);
                loginLog.setBrowser(browser);
                loginLog.setOs(os);
                loginLog.setMsg(message);
                loginLog.setLoginTime(new Date());
                // 日志状态
                if (Constants.LOGIN_FAIL.equals(status)) {
                    loginLog.setStatus(Integer.valueOf(Constants.FAIL));
                } else {
                    loginLog.setStatus(Integer.valueOf(Constants.SUCCESS));
                }
                // 插入数据
                SpringUtils.getBean(ISysLoginLogService.class).create(loginLog);
            }
        };
    }

}
