package com.example.demo.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * OpenAPI (Swagger) 配置类
 * 访问地址: http://localhost:8080/swagger-ui.html
 * API文档JSON: http://localhost:8080/v3/api-docs
 */
@Configuration
public class OpenApiConfig {

    /**
     * OpenAPI 主配置
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("AIGC平台 API 文档")
                        .version("1.0.0")
                        .description("AIGC平台后端API接口文档，包含用户认证、视频生成、支付、订单管理等模块")
                        .contact(new Contact()
                                .name("AIGC平台开发团队")
                                .email("support@vionow.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(Arrays.asList(
                        new Server().url("http://localhost:8080").description("本地开发环境"),
                        new Server().url("http://172.22.0.1:8080").description("内网环境"),
                        new Server().url("https://vionow.com").description("生产环境")
                ))
                .addSecurityItem(new SecurityRequirement().addList("Bearer Authentication"))
                .components(new io.swagger.v3.oas.models.Components()
                        .addSecuritySchemes("Bearer Authentication", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")
                                .description("JWT认证，格式: Bearer {token}")));
    }

    /**
     * 所有API分组
     */
    @Bean
    public GroupedOpenApi allApis() {
        return GroupedOpenApi.builder()
                .group("all")
                .displayName("所有API")
                .pathsToMatch("/api/**")
                .build();
    }

    /**
     * 认证相关API
     */
    @Bean
    public GroupedOpenApi authApis() {
        return GroupedOpenApi.builder()
                .group("auth")
                .displayName("认证授权")
                .pathsToMatch("/api/auth/**", "/api/verification/**")
                .build();
    }

    /**
     * 用户作品API
     */
    @Bean
    public GroupedOpenApi userWorkApis() {
        return GroupedOpenApi.builder()
                .group("user-works")
                .displayName("用户作品")
                .pathsToMatch("/api/works/**")
                .build();
    }

    /**
     * 视频生成API
     */
    @Bean
    public GroupedOpenApi videoGenerationApis() {
        return GroupedOpenApi.builder()
                .group("video-generation")
                .displayName("视频生成")
                .pathsToMatch("/api/text-to-video/**", "/api/image-to-video/**", "/api/storyboard-video/**")
                .build();
    }

    /**
     * 支付相关API
     */
    @Bean
    public GroupedOpenApi paymentApis() {
        return GroupedOpenApi.builder()
                .group("payment")
                .displayName("支付管理")
                .pathsToMatch("/api/payments/**", "/api/orders/**")
                .build();
    }

    /**
     * 会员管理API
     */
    @Bean
    public GroupedOpenApi memberApis() {
        return GroupedOpenApi.builder()
                .group("member")
                .displayName("会员管理")
                .pathsToMatch("/api/members/**", "/api/subscription/**")
                .build();
    }

    /**
     * 积分系统API
     */
    @Bean
    public GroupedOpenApi pointsApis() {
        return GroupedOpenApi.builder()
                .group("points")
                .displayName("积分系统")
                .pathsToMatch("/api/points/**")
                .build();
    }

    /**
     * 任务管理API
     */
    @Bean
    public GroupedOpenApi taskApis() {
        return GroupedOpenApi.builder()
                .group("tasks")
                .displayName("任务管理")
                .pathsToMatch("/api/tasks/**", "/api/queue/**", "/api/task-status/**")
                .build();
    }

    /**
     * 管理后台API
     * 注意：这些API需要ADMIN权限，但文档生成不需要权限验证
     */
    @Bean
    public GroupedOpenApi adminApis() {
        return GroupedOpenApi.builder()
                .group("admin")
                .displayName("管理后台")
                .pathsToMatch("/api/admin/**", "/api/dashboard/**", "/api/analytics/**", "/api/cleanup/**")
                // 在文档生成时，不验证权限
                .build();
    }

    /**
     * 系统设置API
     */
    @Bean
    public GroupedOpenApi settingsApis() {
        return GroupedOpenApi.builder()
                .group("settings")
                .displayName("系统设置")
                .pathsToMatch("/api/settings/**", "/api/api-keys/**")
                .build();
    }

    /**
     * 公共API（无需认证）
     */
    @Bean
    public GroupedOpenApi publicApis() {
        return GroupedOpenApi.builder()
                .group("public")
                .displayName("公共接口")
                .pathsToMatch("/api/public/**", "/api/test/**")
                .build();
    }
}

