package com.xwkj.jcjcgz.app;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

import com.jess.arms.http.GlobalHttpHandler;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

/**
 * ================================================
 * 展示 {@link GlobalHttpHandler} 的用法
 * <p>
 * Created by MVPArmsTemplate on 07/09/2024 10:24
 * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
 * <a href="https://github.com/JessYanCoding">Follow me</a>
 * ================================================
 */
public class GlobalHttpHandlerImpl implements GlobalHttpHandler {
    private Context context;

    public GlobalHttpHandlerImpl(Context context) {
        this.context = context;
    }

    /**
     * 这里可以先客户端一步拿到每一次 Http 请求的结果, 可以先解析成 Json, 再做一些操作, 如检测到 token 过期后
     * 重新请求 token, 并重新执行请求
     *
     * @param httpResult 服务器返回的结果 (已被框架自动转换为字符串)
     * @param chain      {@link okhttp3.Interceptor.Chain}
     * @param response   {@link Response}
     * @return
     */
    @Override
    public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) {
        /* 这里如果发现 token 过期, 可以先请求最新的 token, 然后在拿新的 token 放入 Request 里去重新请求
        注意在这个回调之前已经调用过 proceed(), 所以这里必须自己去建立网络请求, 如使用 Okhttp 使用新的 Request 去请求
        create a new request and modify it accordingly using the new token
        Request newRequest = chain.request().newBuilder().header("token", newToken)
                             .build();

        retry the request

        response.body().close();
        如果使用 Okhttp 将新的请求, 请求成功后, 再将 Okhttp 返回的 Response return 出去即可
        如果不需要返回新的结果, 则直接把参数 response 返回出去即可*/
        return response;
    }

    /**
     * 这里可以在请求服务器之前拿到 {@link Request}, 做一些操作比如给 {@link Request} 统一添加 token 或者 header 以及参数加密等操作
     *
     * @param chain   {@link okhttp3.Interceptor.Chain}
     * @param request {@link Request}
     * @return
     */
    @Override
    public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) {
        /* 如果需要在请求服务器之前做一些操作, 则重新构建一个做过操作的 Request 并 return, 如增加 Header、Params 等请求信息, 不做操作则直接返回参数 request
        return chain.request().newBuilder().header("token", tokenId)
                              .build(); */
        SharedPreferences sharedPreferences = context.getSharedPreferences("sys", Context.MODE_PRIVATE);
        String appCredential = sharedPreferences.getString("appCredential", "");
        String userCredential = sharedPreferences.getString("userCredential", "");
        Request.Builder builder = chain.request().newBuilder();
        if (!TextUtils.isEmpty(appCredential)) {
            try {
                builder.addHeader("appCredential", URLEncoder.encode(appCredential, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        if (!TextUtils.isEmpty(userCredential)) {
            try {
                builder.addHeader("userCredential", URLEncoder.encode(userCredential, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        String token = sharedPreferences.getString("token", "");
        builder.header("Authorization", "Basic c2FiZXI6c2FiZXJfc2VjcmV0");
        builder.header("Tenant-Id", "000000");
        HttpUrl url = request.url();
        if (!url.toString().contains("blade-auth/oauth/token")) {
            builder.header("Blade-Requested-With", "BladeHttpRequest");
            if (!TextUtils.isEmpty(token)) {
                builder.header("Blade-Auth", "bearer " + token);
            }
        }
        return builder.build();
    }
}
