package cn.aqroid.business.auth.util;

import cn.aqroid.business.auth.domain.ApiLoginUser;

/**
 * API登录用户上下文持有者
 * 使用ThreadLocal存储当前请求的登录用户信息
 *
 * @author aqroid
 * @date 2026-01-12
 */
public class ApiLoginUserHolder {

    private static final ThreadLocal<ApiLoginUser> LOGIN_USER_HOLDER = new ThreadLocal<>();

    /**
     * 设置当前登录用户
     */
    public static void setLoginUser(ApiLoginUser loginUser) {
        LOGIN_USER_HOLDER.set(loginUser);
    }

    /**
     * 获取当前登录用户
     */
    public static ApiLoginUser getLoginUser() {
        return LOGIN_USER_HOLDER.get();
    }

    /**
     * 清除当前登录用户
     */
    public static void clear() {
        LOGIN_USER_HOLDER.remove();
    }

    /**
     * 获取当前用户ID
     */
    public static Long getUserId() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getUserId() : null;
    }

    /**
     * 获取当前用户openid
     */
    public static String getOpenid() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getOpenid() : null;
    }

    /**
     * 获取当前用户类型
     */
    public static String getUserType() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getUserType() : null;
    }

    /**
     * 获取当前租户ID
     */
    public static Long getTenantId() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null ? loginUser.getTenantId() : null;
    }

    /**
     * 判断是否已登录
     */
    public static boolean isLoggedIn() {
        return getLoginUser() != null;
    }

    /**
     * 判断是否为顾客
     */
    public static boolean isCustomer() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null && loginUser.isCustomer();
    }

    /**
     * 判断是否为商家
     */
    public static boolean isMerchant() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null && loginUser.isMerchant();
    }

    /**
     * 判断是否为代练
     */
    public static boolean isPlayer() {
        ApiLoginUser loginUser = getLoginUser();
        return loginUser != null && loginUser.isPlayer();
    }
}
