package com.bonus.system.api.domain;

import com.alibaba.fastjson2.JSON;
import com.bonus.common.core.utils.DateUtils;
import com.bonus.common.core.utils.ServletUtils;
import com.bonus.common.core.utils.StringUtils;
import com.bonus.common.core.utils.ip.IpUtils;

import com.bonus.system.api.model.LoginUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.ibatis.type.Alias;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.http.HttpMethod;
import org.springframework.validation.BindingResult;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;

/**
 * 日志实体
 *
 * @author bonus
 */
@Data
@Alias("SysLogsVo")
public class SysLogsVo {

    /**
     * 日志id
     */
    @ApiModelProperty(value = "日志ID")
    private String logId;
    /**
     * 操作人名称
     */
    private String operaUserName;
    /**
     * 访问ip
     */
    @ApiModelProperty(value = "操作ip")
    private String ip;
    /**
     * 操作人id
     */
    @ApiModelProperty(value = "操作人ID")
    private String userId;
    /**
     * 操作模块
     */
    @ApiModelProperty(value = "操作模块")
    private String model;
    /**
     * 操作时间
     */
    @ApiModelProperty(value = "操作时间")
    private String operTime;
    /**
     * 操作详情
     */
    @ApiModelProperty(value = "操作详情")
    private String  operateDetail;
    /**
     *操作类型
     */
    @ApiModelProperty(value = "操作类型  增删改查 登录 登出")
    private String  operType;
    /**
     * 操作方法
     */
    @ApiModelProperty(value = "执行方法")
    private String method;
    /**
     *请求路径
     */
    @ApiModelProperty(value = "操作页面路径URI")
    private String operUri;
    /**
     * 日志类型 1 业务日志 0 系统日志  2异常日志
     */
    @ApiModelProperty(value = "日志类型 1 业务日志 0 系统日志  2异常日志")
    private int logType;
    /**
     * 执行结果
     */
    @ApiModelProperty(value = "执行结果(1.成功/2.失败)")
    private String result;
//    private String  fruit;
    /**
     * 执行时间
     */
    @ApiModelProperty(value = "执行时间(秒/ms)")
    private String times;
    /**
     * 失败原因
     */
    @ApiModelProperty(value = "失败原因")
    private String failureReason;
    /**
     * 异常等级
     */
    @ApiModelProperty(value = "异常事件等级(高、中、低")
    private String grade;
    /**
     * 异常类型(ip异常/越权)
     */
    @ApiModelProperty(value = "异常类型(ip异常/越权)")
    private String errType;
    /**
     * 方法类型
     */
    private String methodType;
    /**
     * 模块名称
     */
    private String title;

    @ApiModelProperty(value = "操作参数")
    private String params;
    /**
     * 返回的数据
     */
    private String resultData;



    private  int num;

    /**
     * 排序字段 1,2,3,4,5,6,7,8,
     */
    private String logSort;
    /**
     * 倒序 1 正序 2
     */
    private String logDesc;

    private String startTime;

    private String endTime;

    //查询类型 1 按日志类型 2 按操作类型 3 按操作人
    private String type;

    private String capacity;
    /**
     * 0未处理，1已处理
     */
    private String warningStatus;

    /**
     * 越权记录
     * @param loginUser
     * @return
     */
    public static  SysLogsVo  getExceedAuthorithSysLogsVo(LoginUser loginUser, ProceedingJoinPoint joinPoint)  {
        SysLogsVo vo=new SysLogsVo();
        try{
            String uuid= UUID.randomUUID().toString().replace("-","").toUpperCase();
            vo.setLogId(uuid);
            String ip = loginUser.getIpaddr();
            vo.setIp(ip);
            // 设置方法名称
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            //方法
            vo.setMethod(className + "." + methodName + "()");
            //请求方法
            vo.setMethodType(ServletUtils.getRequest().getMethod());
            //void->无参数返回的
            vo.setResult("成功");
            vo.setFailureReason("操作未授权");
            vo.setGrade("高");
            vo.setErrType("越权访问");
            vo.setOperUri(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
            vo.setOperTime(DateUtils.getTime());
            vo.setLogType(2);
         //
            if (StringUtils.isNotBlank(loginUser.getUsername())){
                vo.setOperaUserName(loginUser.getUsername());
            }
            Long userId=loginUser.getUserid();
            if (userId!=null && userId!=0L) {
                vo.setUserId(userId.toString());
            }
            return  vo;
        }catch (Exception e){
            System.err.println("越权记录");
        }
        return  vo;

    }




}
