package com.emotion.util;

import lombok.extern.slf4j.Slf4j;

/**
 * 用户上下文持有者
 * 用于在当前线程中存储用户信息
 * 
 * @author huazhongmin
 * @date 2025-07-23
 */
@Slf4j
public class UserContextHolder {

    /**
     * 用户ID线程本地变量
     */
    private static final ThreadLocal<String> USER_ID_HOLDER = new ThreadLocal<>();
    
    /**
     * 用户名线程本地变量
     */
    private static final ThreadLocal<String> USERNAME_HOLDER = new ThreadLocal<>();
    
    /**
     * 用户类型线程本地变量
     */
    private static final ThreadLocal<String> USER_TYPE_HOLDER = new ThreadLocal<>();
    
    /**
     * 客户端IP线程本地变量
     */
    private static final ThreadLocal<String> CLIENT_IP_HOLDER = new ThreadLocal<>();
    
    /**
     * 请求ID线程本地变量
     */
    private static final ThreadLocal<String> REQUEST_ID_HOLDER = new ThreadLocal<>();

    /**
     * Token线程本地变量
     */
    private static final ThreadLocal<String> TOKEN_HOLDER = new ThreadLocal<>();

    /**
     * 设置当前用户ID
     * 
     * @param userId 用户ID
     */
    public static void setCurrentUserId(String userId) {
        USER_ID_HOLDER.set(userId);
        log.debug("设置当前用户ID: {}", userId);
    }

    /**
     * 获取当前用户ID
     * 
     * @return 用户ID
     */
    public static String getCurrentUserId() {
        return USER_ID_HOLDER.get();
    }
    
    /**
     * 设置当前用户名
     * 
     * @param username 用户名
     */
    public static void setCurrentUsername(String username) {
        USERNAME_HOLDER.set(username);
        log.debug("设置当前用户名: {}", username);
    }

    /**
     * 获取当前用户名
     * 
     * @return 用户名
     */
    public static String getCurrentUsername() {
        return USERNAME_HOLDER.get();
    }
    
    /**
     * 设置当前用户类型
     * 
     * @param userType 用户类型
     */
    public static void setCurrentUserType(String userType) {
        USER_TYPE_HOLDER.set(userType);
        log.debug("设置当前用户类型: {}", userType);
    }

    /**
     * 获取当前用户类型
     * 
     * @return 用户类型
     */
    public static String getCurrentUserType() {
        return USER_TYPE_HOLDER.get();
    }
    
    /**
     * 设置客户端IP
     * 
     * @param clientIp 客户端IP
     */
    public static void setClientIp(String clientIp) {
        CLIENT_IP_HOLDER.set(clientIp);
        log.debug("设置客户端IP: {}", clientIp);
    }

    /**
     * 获取客户端IP
     * 
     * @return 客户端IP
     */
    public static String getClientIp() {
        return CLIENT_IP_HOLDER.get();
    }
    
    /**
     * 设置请求ID
     * 
     * @param requestId 请求ID
     */
    public static void setRequestId(String requestId) {
        REQUEST_ID_HOLDER.set(requestId);
        log.debug("设置请求ID: {}", requestId);
    }

    /**
     * 获取请求ID
     *
     * @return 请求ID
     */
    public static String getRequestId() {
        return REQUEST_ID_HOLDER.get();
    }

    /**
     * 设置当前Token
     *
     * @param token Token
     */
    public static void setCurrentToken(String token) {
        TOKEN_HOLDER.set(token);
        log.debug("设置当前Token: {}", token != null ? "***" : null);
    }

    /**
     * 获取当前Token
     *
     * @return Token
     */
    public static String getCurrentToken() {
        return TOKEN_HOLDER.get();
    }
    
    /**
     * 设置用户上下文信息
     * 
     * @param userId 用户ID
     * @param username 用户名
     * @param userType 用户类型
     * @param clientIp 客户端IP
     * @param requestId 请求ID
     */
    public static void setUserContext(String userId, String username, String userType, 
                                     String clientIp, String requestId) {
        setCurrentUserId(userId);
        setCurrentUsername(username);
        setCurrentUserType(userType);
        setClientIp(clientIp);
        setRequestId(requestId);
        
        log.debug("设置用户上下文: userId={}, username={}, userType={}, clientIp={}, requestId={}", 
                userId, username, userType, clientIp, requestId);
    }

    /**
     * 清除当前用户ID
     */
    public static void clearUserId() {
        USER_ID_HOLDER.remove();
    }
    
    /**
     * 清除当前用户名
     */
    public static void clearUsername() {
        USERNAME_HOLDER.remove();
    }
    
    /**
     * 清除当前用户类型
     */
    public static void clearUserType() {
        USER_TYPE_HOLDER.remove();
    }
    
    /**
     * 清除客户端IP
     */
    public static void clearClientIp() {
        CLIENT_IP_HOLDER.remove();
    }
    
    /**
     * 清除请求ID
     */
    public static void clearRequestId() {
        REQUEST_ID_HOLDER.remove();
    }

    /**
     * 清除当前Token
     */
    public static void clearToken() {
        TOKEN_HOLDER.remove();
    }

    /**
     * 清除所有用户上下文信息
     */
    public static void clear() {
        clearUserId();
        clearUsername();
        clearUserType();
        clearClientIp();
        clearRequestId();
        clearToken();
        log.debug("清除所有用户上下文信息");
    }
    
    /**
     * 获取当前用户上下文摘要信息
     * 
     * @return 用户上下文摘要
     */
    public static String getContextSummary() {
        return String.format("UserContext[userId=%s, username=%s, userType=%s, clientIp=%s, requestId=%s]",
                getCurrentUserId(), getCurrentUsername(), getCurrentUserType(), 
                getClientIp(), getRequestId());
    }
    
    /**
     * 检查是否有用户上下文
     * 
     * @return 是否有用户上下文
     */
    public static boolean hasUserContext() {
        return getCurrentUserId() != null || getCurrentUsername() != null;
    }
}
