package com.yanzuoguang.cloud.aop;

import com.rabbitmq.client.Channel;
import com.yanzuoguang.util.vo.CloudConfig;
import com.yanzuoguang.cloud.vo.YzgFileUploadReqVo;
import com.yanzuoguang.util.helper.JsonHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.amqp.core.Message;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * 配置文件处理
 *
 * @author 颜佐光
 */
@Component
public class AspectLogBody {

    /**
     * 获取请求内容
     *
     * @param joinPoint 方法
     * @return 方法的请求参数
     */
    public Object getRequestBody(ProceedingJoinPoint joinPoint) {
        return getFirstDataParameter(joinPoint.getArgs());
    }

    /**
     * 获取请求的参数
     *
     * @param args 所有参数
     * @return 地一个参数对象
     */
    private Object getFirstDataParameter(Object[] args) {
        // 获取请求参数
        List<Object> para = getDataParameters(args);
        Object paraTo = para;
        if (para.size() == 1) {
            paraTo = para.get(0);
        }
        return paraTo;
    }

    /**
     * 获取数据参数
     *
     * @param args 所有参数
     * @return 有效参数
     */
    private List<Object> getDataParameters(Object[] args) {
        List<Object> para = new ArrayList<>();
        for (Object item : args) {
            if (item instanceof HttpServlet
                    || item instanceof HttpServletResponse
                    || item instanceof HttpServletRequest
                    || item instanceof MultipartFile
                    || item instanceof Message
                    || item instanceof Channel
                    || item instanceof YzgFileUploadReqVo
            ) {
                continue;
            }
            para.add(item);
        }
        return para;
    }

    /**
     * 获取消息内容
     *
     * @param message 消息
     * @return 消息内容
     */
    public String getRequestBody(Message message) {
        return new String(message.getBody(), StandardCharsets.UTF_8);
    }
}