package com.lemon.utils;

import bsh.StringUtil;
import com.alibaba.fastjson.JSONPath;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpRequest;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: Lemon
 * @description: 鉴权类
 * @author: ray
 * @create: 2022-09-24 16:22
 **/
public class AuthorizationUtils {

    // 定义为静态，随着类加载而加载，模拟的一个环境变量
    public static final Map<String, String> env = new HashMap<>();

    /**
     * 1、从接口响应中获取token信息
     * 2、把Token信息存储到环境变量中
     * 使用jsonpath:  fastjson 1.2.0之后的版本支持JSONPath。这是一个很强大的功能，可以在java框架中当作对象查询语言（OQL）来使用。
     * @param response:
     */
    public static void storeToken(String response) {
        Object token = JSONPath.read(response, "$.data.token_info.token");
        // 如果Token不为空说明登录成功
        if (token != null) {
            //将Token存储到环境变量
            env.put("token", token.toString());
            // 如果Token不为空，那么获取用户ID并且存储
            Object memberId = JSONPath.read(response, "$data.id");
            if (memberId != null) {
                env.put("${member_id}", memberId.toString());
            }
        }
    }

    /**
     * 判断环境变量中是否存在Token值，如果存在的话，在发送请求时设置token
     *
     * @param request
     */
    public static void setTokenInRequest(HttpRequest request) {
        // 从环境变量中取出Token
        String token = env.get("token");
        // 判断如果token不为空
        if (StringUtils.isNotBlank(token)) {
            // 将token设置到header中
            request.setHeader("Authorization", "Bearer " + token);
        }

    }


    public static void main(String[] args) {
        String json = "{\"errno\":0,\"errmsg\":\"ok\",\"IsPrint\":false,\"data\":{\"log_id\":\"1354006722083980421\",\"action_rule\":{\"pos_1\":[],\"pos_2\":[],\"pos_3\":[]}}}";
        // 精准搜索：按层级匹配
        Object read = JSONPath.read(json, "$.data.log_id");
        //模糊搜索：默认为数组，找到的是所有的多个匹配值
        Object read1 = JSONPath.read(json, "$..log_id");

        System.out.println(read);
    }

}
