package com.spot.utils;

import com.alibaba.fastjson2.JSON;
import com.spot.entity.dto.UserHeader;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * 请求工具类，从请求头中解析用户信息
 *
 * @author jean
 * @date 2026-05-06
 */
@Slf4j
public class RequestUtils {

    /**
     * 从请求头 "user" 字段解析用户信息（JSON格式）
     *
     * @param request HTTP请求
     * @return 用户信息，解析失败返回null
     */
    public static UserHeader getUserFromHeader(HttpServletRequest request) {
        if (request == null) {
            return null;
        }
        String userJson = request.getHeader("user");
        if (!StringUtils.hasText(userJson)) {
            return null;
        }
        try {
            return JSON.parseObject(userJson.trim(), UserHeader.class);
        } catch (Exception e) {
            log.error("解析请求头用户信息失败, value: {}", userJson, e);
            return null;
        }
    }

    /**
     * 从请求头获取用户ID
     *
     * @param request HTTP请求
     * @return 用户ID，获取失败返回null
     */
    public static Long getUserIdFromHeader(HttpServletRequest request) {
        UserHeader userHeader = getUserFromHeader(request);
        return userHeader != null ? userHeader.getId() : null;
    }

    /**
     * 从请求头获取用户ID，用户信息不存在时抛出异常
     *
     * @param request HTTP请求
     * @return 用户ID
     * @throws IllegalArgumentException 用户信息为空时抛出
     */
    public static Long getUserIdFromHeaderOrThrow(HttpServletRequest request) {
        UserHeader userHeader = getUserFromHeader(request);
        if (userHeader == null || userHeader.getId() == null) {
            throw new IllegalArgumentException("用户未登录，请检查请求头中的user字段");
        }
        return userHeader.getId();
    }

    /**
     * 从请求头 "lang" 字段获取语言标识
     * 未传时返回 zh_CN；可与枚举 {@code getMessage(lang)} 的语言键（如 zh_CN、en_US）对应。
     *
     * @param request HTTP请求
     * @return 语言标识（如 zh_CN、en_US）
     */
    public static String getLangFromHeader(HttpServletRequest request) {
        if (request == null) {
            return "zh_CN";
        }
        String lang = request.getHeader("lang");
        if (!StringUtils.hasText(lang)) {
            return "zh_CN";
        }
        return lang.trim();
    }
}
