package com.pingcap.community.blogserver.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springdoc.core.customizers.OperationCustomizer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenAPIConfiguration {

  @Bean
  public GroupedOpenApi actuatorApi(
      OpenApiCustomiser actuatorOpenApiCustomiser,
      OperationCustomizer actuatorCustomizer) {
    return GroupedOpenApi.builder()
        .group("Actuator")
        .pathsToMatch("/actuator/**")
        .addOpenApiCustomiser(actuatorOpenApiCustomiser)
        .addOperationCustomizer(actuatorCustomizer)
        .build();
  }

  @Bean
  public GroupedOpenApi mainApi(OpenApiCustomiser sdrPureJsonOpenApiCustomizer) {
    return GroupedOpenApi.builder()
        .group("Main")
        .pathsToMatch("/api/**")
        .pathsToExclude("/api/manage/**")
        .addOpenApiCustomiser(sdrPureJsonOpenApiCustomizer)
        .build();
  }

  @Bean
  public GroupedOpenApi ManageApi(OpenApiCustomiser sdrPureJsonOpenApiCustomizer) {
    return GroupedOpenApi.builder()
        .group("Manage")
        .pathsToMatch("/api/manage/**")
        .addOpenApiCustomiser(sdrPureJsonOpenApiCustomizer)
        .build();
  }

  @Bean
  public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
    return new OpenAPI()
        .info(
            new Info()
                .title("TiDB Community Blog API")
                .version(appVersion)
                .description("TiDB Community Blog API"));
  }
}
