package common.handler;

import com.jfinal.handler.Handler;
import com.jfinal.kit.StrKit;

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

/**
 * 全局 CORS 处理器，允许所有来源的跨域请求。
 * ⚠️ 仅用于开发和测试环境，生产环境请勿直接使用 '*'
 * 而是应该指定具体的 allowedOrigin。
 */
public class AllCorsHandler extends Handler {

    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        // *** 关键修改：将 '*' 替换为具体的调用方域名 ***
        String ALLOWED_ORIGIN = System.getenv("URL_BASE");
        String ALLOWED_ORIGIN_ADMIN = System.getenv("URL_BASE_ADMIN");
        
        // 从请求头中获取 Origin
        String origin = request.getHeader("Origin");

        if (StrKit.notBlank(origin)) {
             // 可以在这里添加白名单校验，例如：
             if (origin.equals(ALLOWED_ORIGIN) 
                     || origin.equals(ALLOWED_ORIGIN_ADMIN)
                     || origin.equals(ALLOWED_ORIGIN + ":9000")
                     || origin.contains(":7777")
                     || origin.contains(":7778")) {
                 response.setHeader("Access-Control-Allow-Origin", origin);
             } else {
                 // 拒绝不认识的 Origin
                 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                 isHandled[0] = true;
                 return;
             }

            // 如果你100%确定这个Origin是安全的，可以直接设置
            response.setHeader("Access-Control-Allow-Origin", origin);
        }        

        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        // 确保继续包含你自定义的 headers，如 dl_token
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,dl_token,dl-token");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true"); // 这一行现在可以正常使用了

        // 处理 OPTIONS 预检请求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            isHandled[0] = true;
            return;
        }

        next.handle(target, request, response, isHandled);
    }
}
