package com.dora.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {

    private final JwtAuthenticationFilter jwtAuthenticationFilter;
    private final ApiKeyAuthenticationFilter apiKeyAuthenticationFilter;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 禁用 CSRF，因为我们使用 JWT
            .csrf(csrf -> csrf.disable())

            // 配置会话管理为无状态
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))

            // 配置URL的授权规则
            .authorizeHttpRequests(authz -> authz
                // 公开访问的用户端端点（无需认证）
                .requestMatchers(
                        "/",
                        "/index.html",
                        "/user/auth/**",           // 用户认证（登录、注册）
                        "/admin/auth/**",          // 管理员认证（登录、注册）
                        "/user/msm/**",            // 短信服务
                        "/user/course/**",         // 课程浏览
                        "/user/workflow/**",       // 工作流浏览
                        "/user/search/**",         // 搜索功能
                        "/user/oss/**",            // OSS上传
                        "/user/vod/**",            // 视频点播
                        "/user/promotion/**",      // 推广相关
                        "/user/gift/**",           // 礼品码
                        "/user/membership/**",     // 会员套餐
                        "/user/pay/**",            // 支付接口
                        "/user/wechat/**",         // 微信相关
                        "/user/uv/**",             // UV统计
                        "/user/v1/test/**",        // 测试接口
                        "/user/v1/external/**",    // 外部API
                        "/user/v1/workflow-likes/**",
                        "/user/v1/promotion-rules/**",
                        "/user/wechat-qr/**",      // 企业微信二维码
                        "/user/banner/**",         // Banner图
                        "/user/promotion-poster/**", // 推广海报
                        "/user/points/packages/**", // 积分套餐浏览（公开）
                        "/user/ai/models/**",      // AI模型列表查询（公开）
                        "/user/plaza/works/list",  // 广场作品列表（公开浏览）
                        "/user/plaza/works/*",     // 广场作品详情（公开浏览）
                        "/user/plaza/stats",       // 广场统计数据（公开浏览）
                        "/user/vl/api-key/validate", // API Key验证（公开）
                        "/public/**",
                        // Swagger UI
                        "/swagger-ui.html",
                        "/swagger-ui/**",
                        "/v3/api-docs/**",
                        "/webjars/**",
                        "/doc.html",
                        // 静态资源
                        "/static/**",
                        "/*.html",
                        "/*.js",
                        "/*.css",
                        "/debug_oss_upload.html"
                ).permitAll()

                // 管理员端点（需要ADMIN角色，角色值为1的admin_user）
                .requestMatchers("/admin/**").hasRole("ADMIN")
                
                // 需要用户登录的端点（只需认证，不检查具体角色）
                // 支持JWT Token和API Key两种认证方式
                .requestMatchers(
                        "/user/v1/api-key/**",     // API密钥管理
                        "/user/v1/orders/**",      // 订单管理
                        "/user/ai/tasks/**",       // AI任务
                        "/user/tools/**",          // 工具服务（支持API Key调用）
                        "/user/balance/**",        // 余额与提现
                        "/user/withdraw/**",       // 提现申请
                        "/user/video-likes/**",    // 视频点赞
                        "/user/course-likes/**",   // 课程点赞
                        "/user/course-favorites/**", // 课程收藏
                        "/user/v1/my-workflows/**", // 我的工作流
                        "/user/v1/my-videos/**",   // 我的视频
                        "/user/points/recharge",   // 积分充值（创建订单）
                        "/user/points/recharge/**", // 积分充值相关（记录、统计）
                        "/user/points/consumption/**" // 积分消费查询（余额、明细、统计）
                ).authenticated()

                // 其他所有请求都需要认证
                .anyRequest().authenticated()
            )
            
            // 添加API Key认证过滤器（优先级低于JWT，先检查JWT再检查API Key）
            .addFilterBefore(apiKeyAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
            // 添加JWT认证过滤器
            .addFilterBefore(jwtAuthenticationFilter, ApiKeyAuthenticationFilter.class);

        return http.build();
    }
} 