package com.casic.missiles.config;

import com.casic.missiles.config.swagger.SwaggerEntity;
import com.casic.missiles.utils.SpringContextUtil;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.google.common.collect.Lists;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.annotation.PostConstruct;

/**
 * @Description:
 * @Author: wangpeng
 * @Date: 2022/11/9 14:51
 */
@Configuration //声明该类为配置类
@EnableSwagger2 //声明启动Swagger2
@EnableKnife4j
public class SwaggerConfig{
//    @Bean
//    public Docket customDocket() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .select()
//                .apis(RequestHandlerSelectors.basePackage("com.casic.missiles.controller"))//扫描的包路径
//                .paths(PathSelectors.any())
//                .build();
//    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("计量综合管理系统")//文档说明
                .version("1.0.0")//文档版本说明
                .build();
    }

    /**
     * 注入自定义swagger分组
     */
    @PostConstruct
    public void importDocketGroup() {
        // 循环SwaggerEntity中的所有定义
        for (SwaggerEntity value : SwaggerEntity.values()) {
            // 注册bean
            Docket docket = SpringContextUtil.registerBean(null, Docket.class, Lists.newArrayList(DocumentationType.SWAGGER_2), null);
            // 执行docket的一些定义
            docket  // 是否启用Swagger
                    .enable(true)
                    // 用来创建该API的基本信息，展示在文档的页面中（自定义展示的信息）
                    .apiInfo(apiInfo())
                    // 设置哪些接口暴露给Swagger展示
                    .select()
                    // 设置SwaggerEntity中定义的需要扫描的包
                    .apis(value.getApis())
                    // 扫描所有 .apis(RequestHandlerSelectors.any())
                    .paths(value.getPaths())
                    .build()
                    // 设置分组名
                    .groupName(value.getGroupName());
                    // 设置安全模式，swagger可以设置访问token
//                    .securitySchemes(securitySchemes())
//                    .securityContexts(securityContexts())
//                    .pathMapping(pathMapping);
        }
    }

}
