package com.zjrs.zwnw.auth.service;

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 认证 Redis 服务
 * 负责将登录用户信息存入 Redis，以 Token 为 key，供后续接口鉴别身份
 */
@Service
public class AuthRedisService {

    private static final Logger log = LoggerFactory.getLogger(AuthRedisService.class);

    /** Redis key 前缀 */
    private static final String KEY_PREFIX = "zjrs:auth:token:";

    /** Redis 头像 key 前缀 */
    private static final String AVATAR_KEY_PREFIX = "zjrs:user:avatar:";

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 将用户头像存入 Redis
     *
     * @param userId 用户ID
     * @param avatarBase64 头像Base64字符串
     */
    public void saveUserAvatar(String userId, String avatarBase64) {
        String key = AVATAR_KEY_PREFIX + userId;
        // 头像不设置过期时间，或者设置较长的过期时间
        redisTemplate.opsForValue().set(key, avatarBase64);
        log.info("[Auth] 用户 {} 头像已缓存至 Redis", userId);
    }

    /**
     * 根据 用户ID 从 Redis 获取用户头像
     *
     * @param userId 用户ID
     * @return 头像Base64字符串，不存在时返回 null
     */
    public String getUserAvatar(String userId) {
        String key = AVATAR_KEY_PREFIX + userId;
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 将用户信息存入 Redis
     *
     * @param token         JWT Token 字符串
     * @param userInfo      用户信息 Map（loginId, userName, operid, operunitid）
     * @param expireSeconds 有效期（秒）
     */
    public void saveToken(String token, Map<String, Object> userInfo, long expireSeconds) {
        String key = KEY_PREFIX + token;
        String value = JSON.toJSONString(userInfo);
        redisTemplate.opsForValue().set(key, value, expireSeconds, TimeUnit.SECONDS);
        log.info("[Auth] 用户 {} 登录成功，Token 已缓存至 Redis，有效期 {}s", userInfo.get("loginId"), expireSeconds);
    }

    /**
     * 根据 Token 从 Redis 获取用户信息
     *
     * @param token JWT Token 字符串
     * @return 用户信息 Map，不存在时返回 null
     */
    @SuppressWarnings("unchecked")
    public Map<String, Object> getUserInfo(String token) {
        String key = KEY_PREFIX + token;
        String value = redisTemplate.opsForValue().get(key);
        if (value == null) {
            return null;
        }
        return JSON.parseObject(value, Map.class);
    }

    /**
     * 删除 Token（登出）
     *
     * @param token JWT Token 字符串
     */
    public void deleteToken(String token) {
        String key = KEY_PREFIX + token;
        redisTemplate.delete(key);
        log.info("[Auth] Token {} 已从 Redis 中删除（用户登出）", token);
    }
}
