package com.hfkj.service.sec.impl;

import com.alibaba.fastjson.JSONObject;
import com.hfkj.common.alipay.AliyunService;
import com.hfkj.common.utils.RequestUtils;
import com.hfkj.dao.SecUserLoginLogMapper;
import com.hfkj.entity.SecUser;
import com.hfkj.entity.SecUserLoginLog;
import com.hfkj.entity.SecUserLoginLogExample;
import com.hfkj.service.sec.SecUserLoginLogService;
import com.hfkj.sysenum.SecUserLoginLogStatusEnum;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

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

/**
 * @className: SecUserLoginLogServiceImpl
 * @author: HuRui
 * @date: 2024/4/3
 **/
@Service("secUserLoginLogService")
public class SecUserLoginLogServiceImpl implements SecUserLoginLogService {

    @Resource
    private SecUserLoginLogMapper secUserLoginLogMapper;

    @Override
    public void create(SecUserLoginLog userLoginLog) {
        userLoginLog.setCreateTime(new Date());
        secUserLoginLogMapper.insert(userLoginLog);
    }

    @Override
    public void asyncCreateLog(SecUser user, HttpServletRequest request) {
        // 创建一个单线程的线程池
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        // 异步记录登录信息
        singleThreadExecutor.submit(new Runnable() {
            @Override
            public void run() {
                SecUserLoginLog loginLog = new SecUserLoginLog();
                loginLog.setUserId(user.getId());
                loginLog.setUserLoginName(user.getLoginName());
                loginLog.setIp(RequestUtils.getIpAddress(request));
                // 查询ip归属地
                JSONObject ipAddress = AliyunService.queryAddress(loginLog.getIp());
                if (ipAddress != null) {
                    loginLog.setCountry(StringUtils.isNotBlank(ipAddress.getString("country"))?ipAddress.getString("country"):"未知");
                    loginLog.setRegionId(StringUtils.isNotBlank(ipAddress.getString("region_id"))?ipAddress.getString("region_id"):null);
                    loginLog.setRegionName(StringUtils.isNotBlank(ipAddress.getString("region"))?ipAddress.getString("region"):"未知");
                    loginLog.setCityId(StringUtils.isNotBlank(ipAddress.getString("city_id"))?ipAddress.getString("city_id"):null);
                    loginLog.setCityName(StringUtils.isNotBlank(ipAddress.getString("city"))?ipAddress.getString("city"):"未知");
                    loginLog.setIsp(StringUtils.isNotBlank(ipAddress.getString("isp"))?ipAddress.getString("isp"):"未知");
                    loginLog.setStatus(SecUserLoginLogStatusEnum.status1.getCode());
                } else {
                    loginLog.setCountry("未知");
                    loginLog.setRegionName("未知");
                    loginLog.setCityName("未知");
                    loginLog.setIsp("未知");
                    loginLog.setStatus(SecUserLoginLogStatusEnum.status2.getCode());
                }
                create(loginLog);
            }
        });
        singleThreadExecutor.shutdown();
    }

    @Override
    public List<SecUserLoginLog> getLogList(Map<String, Object> param) {
        SecUserLoginLogExample example = new SecUserLoginLogExample();
        SecUserLoginLogExample.Criteria criteria = example.createCriteria();

        if (MapUtils.getLong(param, "userId") != null) {
            criteria.andUserIdEqualTo(MapUtils.getLong(param, "userId"));
        }

        if (StringUtils.isNotBlank(MapUtils.getString(param, "userLoginName"))) {
            criteria.andUserLoginNameEqualTo(MapUtils.getString(param, "userLoginName"));
        }

        if (MapUtils.getInteger(param, "status") != null) {
            criteria.andStatusEqualTo(MapUtils.getInteger(param, "status"));
        }

        example.setOrderByClause("create_time desc");
        return secUserLoginLogMapper.selectByExample(example);
    }


}
