package com.nebula.erp.purchase.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 OpenAPIConfiguration {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Nebula ERP Purchase API")
                        .description("APIs for managing Purchase and Purchase Returns")
                )
                .servers(List.of(new Server().url("http://localhost:8086").description("local"),
                        new Server().url("http://localhost:8084").description("live")))
                .tags(Arrays.asList(
                        new Tag().name("Supplier APIs"),
                        new Tag().name("Purchase APIs"),
                        new Tag().name("GRN APIs"),
                        new Tag().name("Purchase Return APIs"),
                        new Tag().name("Debit Note 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/suppliers") &&
                            !entry.getKey().startsWith("/api/purchases")&&
                            !entry.getKey().startsWith("/api/grn")&&
                            !entry.getKey().startsWith("/api/purchase-return") &&
                            !entry.getKey().startsWith("/api/debit-notes")
            );
        };
    }

}