package egovframework.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.info.License;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.SpringDocUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Swagger UI 설정 클래스
 * OpenAPI 3.0 스펙을 기반으로 API 문서화를 위한 설정을 제공합니다.
 * 세션 기반 인증을 사용하므로 별도의 보안 스키마를 설정하지 않습니다.
 * @Controller 어노테이션이 있는 클래스도 스캔하도록 설정합니다.
 */
@Configuration
public class SwaggerConfig {

    static {
        // @Controller 어노테이션이 있는 클래스도 스캔하도록 설정
        SpringDocUtils.getConfig().addAnnotationsToIgnore(RequestMapping.class);
    }

    /**
     * 모든 API를 문서화하는 GroupedOpenApi 빈을 정의합니다.
     * 
     * @return GroupedOpenApi 설정 객체
     */
    @Bean
    public GroupedOpenApi allApi() {
        return GroupedOpenApi.builder()
                .group("All")
                .packagesToScan("go.kr.project")
                .pathsToMatch("/**")
                .build();
    }

    /**
     * 로그인 관련 API를 문서화하는 GroupedOpenApi 빈을 정의합니다.
     * 
     * @return GroupedOpenApi 설정 객체
     */
    @Bean
    public GroupedOpenApi loginApi() {
        return GroupedOpenApi.builder()
                .group("Login")
                .packagesToScan("go.kr.project.login")
                .pathsToMatch("/login/**")
                .build();
    }

    /**
     * OpenAPI 설정을 정의합니다.
     * API 문서의 기본 정보(제목, 설명, 버전 등)를 설정합니다.
     * 
     * @return OpenAPI 설정 객체
     */
    @Bean
    public OpenAPI openAPI() {
        Info info = new Info()
                .title("XIT Framework API")
                .description("XIT Framework API 문서 - 세션 기반 인증 사용")
                .version("v1.0.0")
                .license(new License().name("Apache 2.0").url("http://springdoc.org"));

        return new OpenAPI()
                .components(new Components())
                .info(info);
    }
}
