package com.nebula.erp.product.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
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 io.swagger.v3.oas.models.tags.Tag;
import org.springdoc.core.customizers.OpenApiCustomizer;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

@Configuration
public class OpenApiConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Nebula ERP Product API")
                        .description("APIs for managing Products")
                )
                .servers(List.of(new Server().url("http://localhost:8084").description("local"),
                        new Server().url("http://localhost:8085").description("live")))
                .tags(Arrays.asList(
                        new Tag().name("Brand APIs"),
                        new Tag().name("Category APIs"),
                        new Tag().name("GetImage API"),
                        new Tag().name("Fees APIs"),
                        new Tag().name("Product APIs"),
                        new Tag().name("Tax APIs"),
                        new Tag().name("Coupons APIs")
                ))
                .addSecurityItem(new SecurityRequirement().addList("bearerAuth"))
                .components(new Components().addSecuritySchemes(
                        "bearerAuth", new SecurityScheme()
                                .type(SecurityScheme.Type.HTTP)
                                .scheme("bearer")
                                .bearerFormat("JWT")
                                .in(SecurityScheme.In.HEADER)
                                .name("Authorization")
                ));
    }


    @Bean
    public OpenApiCustomizer openApiCustomizer() {
        return openApi -> {
            openApi.getPaths().entrySet().removeIf(entry ->
                    !entry.getKey().startsWith("/api/products") &&
                    !entry.getKey().startsWith("/api/categories") &&
                    !entry.getKey().startsWith("/api/brands") &&
                    !entry.getKey().startsWith("/api/tax") &&
                    !entry.getKey().startsWith("/api/fees") &&
                    !entry.getKey().startsWith("/uploads") &&
                    !entry.getKey().startsWith("/coupons")
            );
        };
    }
}


