/*
 * 文 件 名:  AuthInterceptor
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  <描述>
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/5/8
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.huashe.common.data.controller.interceptor;

import com.huashe.common.data.config.ApiAuth;
import com.huashe.common.data.config.AuthKeyType;
import com.huashe.common.data.service.AuthService;
import com.huashe.common.exception.BusinessException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

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

/**
 * 认证拦截器
 * <功能详细描述>
 *
 * @author lvwenbin
 * @version [版本号, 2025/5/8]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class AuthInterceptor implements HandlerInterceptor {
    @Autowired
    private AuthService authService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }

        HandlerMethod handlerMethod = (HandlerMethod) handler;
        ApiAuth apiAuth = handlerMethod.getMethodAnnotation(ApiAuth.class);

        // 不需要认证的方法直接放行
        if (apiAuth == null || !apiAuth.required()) {
            return true;
        }

        // 获取客户端密钥
        String clientKey = getClientKey(request, apiAuth.type());
        if (StringUtils.isEmpty(clientKey)) {
            throw new BusinessException(-1, "Api秘钥缺失，拒绝访问!");
        }

        // 验证密钥有效性
        if (!authService.validateKey(clientKey)) {
            throw new BusinessException(-1, "非法客户端调用，拒绝访问!");
        }

        return true;
    }

    private String getClientKey(HttpServletRequest request, AuthKeyType type) {
        return type == AuthKeyType.HEADER ? request.getHeader("X-API-Key") : request.getParameter("apiKey");
    }
}