package com.ruoyi.common.utils;

import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.spring.SpringUtils;

/**
 * 企业上下文持有者
 * 用于获取当前用户正在使用的企业ID
 */
public class CorpContextHolder {

    /**
     * Redis key 前缀：current_corp:{userId}
     */
    private static final String CURRENT_CORP_KEY_PREFIX = "current_corp:";

    private static final String CURRENT_CORP_KEY_PREFIX_ONLY = "current_corp_only:";

    /**
     * 获取当前用户正在使用的企业ID
     *
     * @return 企业ID (corpId)
     * @throws RuntimeException 如果未设置当前企业
     */
    public static String getCurrentCorpId() {
        // 1. 获取当前登录用户ID
        Long userId = SecurityUtils.getUserId();

        // 2. 从 Redis 获取该用户当前使用的企业ID
        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
        String key = CURRENT_CORP_KEY_PREFIX + userId;
        String corpId = redisCache.getCacheObject(key);

        if (corpId == null || corpId.trim().isEmpty()) {
            throw new RuntimeException("未设置当前使用的企业，请先切换企业");
        }

        return corpId;
    }

    /**
     * 设置当前用户正在使用的企业ID
     *
     * @param corpId 企业ID
     */
    public static void setCurrentCorpId(String corpId) {
        // 1. 获取当前登录用户ID
        Long userId = SecurityUtils.getUserId();

        // 2. 将企业ID存入 Redis
        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
        String key = CURRENT_CORP_KEY_PREFIX + userId;
        redisCache.setCacheObject(key, corpId);
    }

    /**
     * 清除当前用户的企业上下文
     */
    public static void clear() {
        // 1. 获取当前登录用户ID
        Long userId = SecurityUtils.getUserId();

        // 2. 从 Redis 删除
        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
        String key = CURRENT_CORP_KEY_PREFIX + userId;
        redisCache.deleteObject(key);
    }

    /**
     * 检查当前用户是否已设置企业
     *
     * @return true-已设置，false-未设置
     */
    public static boolean hasCurrentCorp() {
        try {
            Long userId = SecurityUtils.getUserId();
            RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
            String key = CURRENT_CORP_KEY_PREFIX + userId;
            String corpId = redisCache.getCacheObject(key);
            return corpId != null && !corpId.trim().isEmpty();
        } catch (Exception e) {
            return false;
        }
    }
}
