package com.ssyf.common.security.helper;

import cn.dev33.satoken.exception.NotWebContextException;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.extra.servlet.ServletUtil;
import com.ssyf.common.core.util.AssertUtil;
import com.ssyf.common.security.constant.SecurityConstant;
import com.ssyf.common.security.domain.ClientContext;
import com.ssyf.common.security.domain.ClientInfo;
import com.ssyf.common.security.filter.ClientContextHolder;
import com.ssyf.common.web.apicode.ApiCodeUser;
import com.ssyf.common.web.error.ServiceRuntimeException;


/**
 * 业务上下文帮助对象
 * @author huwei
 * @date 2022/7/15 15:54
 */
public class ClientContextHelper {

    /**
     * 获取当前业务上下文
     * @return
     */
    public static ClientContext getContext(){
        return ClientContextHolder.getContext();
    }

    /**
     * 获取上下文，并验证是否登录
     * @return
     */
    public static ClientContext getContextAndCheckLogin(){
        checkLogin();
        return getContext();
    }

    /**
     * 获取当前用户的token
     * @return
     */
    public static String getToken() {
        return StpUtil.getTokenValue();
    }

    /**
     * 是否登录
     * @return
     */
    public static boolean isLogin(){
        try {
            return StpUtil.isLogin();
        } catch (NotWebContextException e) {
            return false;
        }
    }

    /**
     * 校验是否登录
     */
    public static void checkLogin() {
        AssertUtil.isTrue(isLogin() , ServiceRuntimeException.instance(ApiCodeUser.NOT_AUTHORIZED));
    }

    /**
     * 校验登录并获取客户信息
     * @return
     */
    public static ClientInfo checkAndGetClientInfo(){
        checkLogin();
        return getClientInfo();
    }

    /**
     * 获取客户信息
     * @return
     */
    public static ClientInfo getClientInfo(){
        if(isLogin()) {
            return LoginHelper.parseAndGetFormCurrentLogin();
        }
        return null;
    }

    /**
     * 获取客户端ip地址
     * @return
     */
    public static String getClientIp() {
        return ServletUtil.getClientIP(ClientContextHelper.getContext().getRequest());
    }


    /**
     * 获取客户的证书信息
     * @return
     */
    public static String getCertificate() {
        return getContext().getRequest().getHeader(SecurityConstant.CERTIFICATE_NAME);
    }

}
