package com.nebula.erp.sales.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 org.springframework.web.servlet.config.annotation.EnableWebMvc;

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

@Configuration
@EnableWebMvc
public class OpenAPIConfiguration {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Nebula ERP Sales API")
                        .description("APIs for managing Sales and Sales Return")
                )
                .servers(List.of(new Server().url("http://localhost:8083").description("local"),
                        new Server().url("http://localhost:8084").description("live")))
                .tags(Arrays.asList(
                        new Tag().name("Sales APIs"),
                        new Tag().name("Sales Returns APIs"),
                        new Tag().name("Credit Notes APIs"),
                        new Tag().name("Prescriptions APIs"),
                        new Tag().name("Prescription Item 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/sales") &&
                            !entry.getKey().startsWith("/api/prescriptions")&&
                            !entry.getKey().startsWith("/api/prescription-items")&&
                            !entry.getKey().startsWith("/api/sales-return") &&
                            !entry.getKey().startsWith("/api/credit-notes")
            );
        };
    }
}