package com.nebula.erp.reports.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 Reports API")
                        .description("APIs for managing All Reports")
                )
                .servers(List.of(new Server().url("http://localhost:8082").description("local"),
                        new Server().url("http://localhost:8084").description("live")))
                .tags(Arrays.asList(
                        new Tag().name("Revenue Reports APIs"),
                        new Tag().name("Sales Reports APIs"),
                        new Tag().name("Inventory Reports APIs"),
                        new Tag().name("Supplier Reports APIs"),
                        new Tag().name("Purchase Reports APIs"),
                        new Tag().name("Patient and Prescription Reports APIs"),
                        new Tag().name("Tax Reports APIs"),
                        new Tag().name("Financial Reports APIs"),
                        new Tag().name("Audit and Compliance APIs"),
                        new Tag().name("KPI Reports 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/reports/revenue") &&
                            !entry.getKey().startsWith("/api/reports/sales")&&
                            !entry.getKey().startsWith("/api/reports/inventory")&&
                            !entry.getKey().startsWith("/api/reports/supplier") &&
                            !entry.getKey().startsWith("/api/reports/purchase")&&
                            !entry.getKey().startsWith("/api/reports/patient-prescription")&&
                            !entry.getKey().startsWith("/api/reports/tax")&&
                            !entry.getKey().startsWith("/api/reports/financial") &&
                            !entry.getKey().startsWith("/api/reports/audit-compliance")&&
                            !entry.getKey().startsWith("/api/kpi")
            );
        };
    }
}
