package com.repair.core;

import com.google.common.base.Predicates;
import com.repair.annotation.ControllerIsShow;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration//配置对象
@EnableSwagger2//声明启动Swagger2
/*
* 两种方式控制生产环境是否显示swagger
* */
//@Profile("!prod")
@Profile({"dev","test"})
public class SwaggerConfiguration {
    /**
     * 创建Docket类型的对象。并使用spring容器管理。
     * Docket是Swagger中的全局配置对象。
     * 请求方式：http://ip地址:端口/项目名/swagger-ui.html#/
     */
    @Bean
    public Docket createRestApi() {
        ApiInfo apiInfo = new ApiInfoBuilder()
                .version("1.1.0") //版本
                .title("视频系统接口文档") //网站标题
                .description("提供测试接口或前端查看对应参数以及返回参数使用") //网站描述
                .contact(new Contact("创海", "https://www.baidu.com/", "a974264710@163.com"))
                //region 在swagger中显示作用不是很大
                /*
                .license("The Apache License") //协议
                .licenseUrl("http://www.baidu.com") //许可证链接地址
                */
                //endregion
                .build();

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo)//参数为类对象，并且这个类对象是swagger版本
                .select()//获取Docket中的选择器。返回ApiSelctorBuilder。构建选择器的。如：扫描什么包的注解。
                .apis(
                        //region 是否在swagger中进行展示对应控制器
                        /*
                         Predicates.not：取反 例如，false -> true
                         withMethodAnnotation：当方法上有注解的时候返回true
                         整体作用：启用该段代码之后如果在方法上使用的自定义的注解：ControllerIsShow
                         则在swagger中不会显示该方法
                        */
                        Predicates.not(
                                RequestHandlerSelectors.withMethodAnnotation(
                                        ControllerIsShow.class
                                )
                        )
                        //endregion
                )
                .apis(RequestHandlerSelectors.basePackage("com.video"))//设定扫描哪个包（包含子包）中的注解。 如果要匹配多个不同包下的控制器可以精确到多个包的统一父级
                //region 匹配路由地址
                /*
                //用正则匹配显示路由地址为swagger开头的链接 即：范围匹配器 以此来控制在swagger中描述哪些控制器
                .paths(
                        PathSelectors.regex("/swagger/.*")
                )
                */
                //endregion
                .build();//重新构建Docket对象

    }
}
