package cn.aqroid.framework.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import cn.aqroid.common.core.tenant.TenantContext;
import cn.aqroid.common.utils.StringUtils;

/**
 * 租户拦截器 - 解析请求中的租户ID并设置到上下文
 *
 * 支持两种方式获取租户ID：
 * 1. 从请求Header中获取 "Tenant-Id"（小程序端）
 * 2. 从登录用户信息中获取（管理后台）
 *
 * @author aqroid
 */
@Component
public class TenantInterceptor implements HandlerInterceptor {

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

    /**
     * Header中租户ID的key
     */
    private static final String TENANT_ID_HEADER = "Tenant-Id";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        Long tenantId = null;

        // 方式1: 从Header中获取（小程序端）
        String tenantIdHeader = request.getHeader(TENANT_ID_HEADER);
        if (StringUtils.isNotEmpty(tenantIdHeader)) {
            try {
                tenantId = Long.parseLong(tenantIdHeader);
                log.debug("从Header中解析租户ID: {}", tenantId);
            } catch (NumberFormatException e) {
                log.warn("Header中的租户ID格式错误: {}", tenantIdHeader);
            }
        }

        // 方式2: 从登录用户信息中获取（管理后台）
        if (tenantId == null) {
            try {
                // 尝试从SecurityContext获取登录用户的租户ID
                tenantId = getTenantIdFromSecurityContext();
                if (tenantId != null) {
                    log.debug("从登录用户中解析租户ID: {}", tenantId);
                }
            } catch (Exception e) {
                // 未登录或用户未绑定租户，跳过
                log.debug("无法从登录用户获取租户ID: {}", e.getMessage());
            }
        }

        // 设置到上下文
        if (tenantId != null) {
            TenantContext.setTenantId(tenantId);
            log.debug("设置租户上下文: tenantId={}, uri={}", tenantId, request.getRequestURI());
        } else {
            log.debug("未识别到租户ID: uri={}", request.getRequestURI());
        }

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) {
        // 请求结束后清理上下文（防止内存泄漏）
        TenantContext.clearAll();
    }

    /**
     * 从SecurityContext获取当前登录用户的租户ID
     * 
     * @return 租户ID，如果未登录或未绑定租户则返回null
     */
    private Long getTenantIdFromSecurityContext() {
        try {
            // 使用反射调用SecurityUtils，避免循环依赖
            Class<?> securityUtilsClass = Class.forName("cn.aqroid.common.utils.SecurityUtils");
            Object loginUser = securityUtilsClass.getMethod("getLoginUser").invoke(null);
            if (loginUser != null) {
                Object user = loginUser.getClass().getMethod("getUser").invoke(loginUser);
                if (user != null) {
                    Object tenantId = user.getClass().getMethod("getTenantId").invoke(user);
                    if (tenantId instanceof Long) {
                        return (Long) tenantId;
                    }
                }
            }
        } catch (Exception e) {
            // 忽略异常，返回null
        }
        return null;
    }
}
